12.6 loadjavaツール
loadjava
ツールは、ファイルからスキーマ・オブジェクトを生成してスキーマにロードします。スキーマ・オブジェクトはJavaソース、クラスおよびデータファイルから作成できます。また、loadjava
ツールでは、SQLJファイルからもスキーマ・オブジェクトを作成できます。
クラスをロードするには、次のSQLデータベース権限が必要です。
-
スキーマにロードする場合は
CREATE PROCEDURE
およびCREATE TABLE
権限。 -
別のスキーマにロードする場合は
CREATE ANY PROCEDURE
およびCREATE ANY TABLE
権限。 -
oracle.aurora.security.JServerPermission.loadLibraryInClass.
classname
。
loadjava
ツールは、コマンドラインから実行するか、またはDBMS_JAVA
クラスに含まれるloadjava
メソッドを使用して実行できます。使用しているJavaアプリケーション内からこのツールを実行する方法は、次のとおりです。
call dbms_java.loadjava('... options...');
オプションは、loadjava
ツールのコマンドラインで指定できるオプションと同じです。各オプションは空白で区切ります。オプションをカンマで区切らないでください。ただし、空白を含む-resolver
オプションは例外です。-resolver
の場合は、次に示すように、他のすべてのオプションを最初の入力パラメータで指定し、-resolver
オプションは2番目のパラメータで指定します。
call dbms_java.loadjava('..options...', 'resolver_options');
-thin
、-oci
、-user
および-password
の各オプションは、loadjava
コマンドライン・ツールのデータベース接続に関連しているため、指定しないでください。出力はstderr
に送信されます。serveroutput
をオンに設定し、必要に応じてdbms_java.set_output
をコールします。
ノート:
loadjava
ツールは、$ORACLE_HOME
の下のbin
ディレクトリに格納されています。
loadjava
ツールは、終了直前に、正常に処理されたかどうかをチェックします。発生したすべての障害は、次のヘッダーの後に要約が示されます。
The following operations failed
データベースへの接続が失われるなど、条件によっては、loadjava
ツールが完了前に停止する場合があります。エラーは次の構文で表示されます。
exiting: error_reason
内容は次のとおりです。
12.6.1 loadjavaツールの構文
loadjava
ツールのコマンド構文は次のとおりです。
ノート:
-
クラス参照の解決では、
-genmissing
オプションおよび-genmissingjar
オプションよりも、(* -)
オプションが推奨されます。 -
-genmissing
オプションおよび-genmissingjar
オプションは、オプション・ファイルまたはオプション表では使用できません。これらのオプションは、すべてのクラスのロードには適用可能で、特定のクラスにのみ使用することはできません。
loadjava {-user | -u} user [@database] [options] file.java | file.class | file.jar | file.zip | file.sqlj | resourcefile | URL... [-casesensitivepub] [-cleargrants] [-debug] [-d | -definer] [-dirprefix prefix] [-e | -encoding encoding_scheme] [-fileout file] [-f | -force] [-genmissing] [-genmissingjar jar_file] [-g | -grant user [, user]...] [-help] [-jarasresource] [-noaction] [-nosynonym] [-nousage] [-noverify] [-o | -oci | oci8] [-optionfile file] [-optiontable table_name] [-publish package] [-pubmain number] [-recursivejars] [-r | -resolve] [-R | -resolver "resolver_spec"] [-resolveonly] [-S | -schema schema] [-stdout] [-stoponerror] [-s | -synonym] [-tableschema schema] [-t | -thin]
[-unresolvedok] [-v | -verbose] [-jarsasdbobjects] [-prependjarnames] [-nativecompile]
12.6.2 loadjavaツールの引数の概要
表12-2は、loadjava
ツールのコマンド引数の一覧です。オプションを変えて同じファイルを指定して複数回loadjava
ツールを実行すると、最後の起動時に指定したオプションが保持されます。ただし、次の2つの例外があります。
-
ダイジェスト表のエントリに一致しているために
loadjava
ツールによってファイルがロードされない場合は、コマンドラインで指定した大半のオプションがスキーマ・オブジェクトに反映されません。例外は-grant
と-resolve
で、これらのオプションは必ず反映されます。loadjava
ツールでダイジェスト表の参照をスキップするように指示するには、-force
オプションを使用する必要があります。 -
-grant
オプションは累積です。特定スキーマの特定クラスに対して起動されたすべてのloadjava
ツールに指定されているユーザーには、EXECUTE
権限が付与されます。
表12-2 loadjavaの引数の概要
引数 | 説明 |
---|---|
|
|
|
クラス、リソースおよびJavaソースをロードするために、サーバー・ホストまたは loadjava –u HR –r –v –proxy proxy_server:1020 http://my.server.com/this/is /the/path/my.jar
Password: password
URLサポートがサーバー内で使用される場合、リモート・ソースにアクセスするための適切なJavaパーミッションが必要です。 |
|
公開時に、大/小文字の区別がある名前が作成されます。名前がすべて大文字でないかぎり、通常、PL/SQLでは名前を引用符で囲む必要があります。 |
|
-grant HR -cleargrants |
|
SQLロギングをオンにします。 |
|
デフォルトでは、クラス・スキーマ・オブジェクトはその実行者の権限で実行されます。このオプションは、定義者の権限をクラスに付与します。このオプションは、UNIXの |
|
|
|
コンパイラのためにソース・ファイルのエンコーディングを識別し、 System.getProperty("file.encoding"); このオプションはソース・ファイルのロード時のみ有効です。 |
|
すべてのメッセージを指定のファイルに表示します。 |
|
ダイジェスト表のエントリに一致する場合でも、ファイルが強制的にロードされます。 |
|
参照をソースから検出することは、参照をクラス・ファイルから検出するよりも困難であり、通常、ライブラリの配布にソースは使用しないため、 欠落しているクラスがロードされるスキーマは、参照元クラスが他のスキーマで作成された場合でも、 |
|
このオプションは、 |
|
ロードされたクラスに対する
ノート:
|
|
|
|
JARファイルを解凍してその中の各クラスをロードするかわりに、JARファイル全体をリソースとしてスキーマにロードします。脚注1 |
|
ファイルに対してアクションを実行しません。これには、スキーマ・オブジェクトの作成、実行パーミッションの付与などのアクションが含まれます。このオプションは、通常、特定のクラスがJARファイルに作成されるのを抑制するために、オプション・ファイル内で使用します。コマンドラインで使用すると、オプション・ファイルでオーバーライドされないかぎり、 |
|
他のJARファイルに含まれているJARファイルをリソースとして処理します。これはデフォルトの動作です。このオプションは、 |
|
クラスのPUBLICシノニムを作成しません。これはデフォルトの動作です。このオプションは、 |
|
オプションが指定されていない場合、または |
|
クラスがバイトコードの検証なしにロードされます。このオプションを使用するには、 |
|
|
|
|
|
このオプションは、パターンおよびオプションのソースがファイルではなくSQL表であること以外は、 |
|
|
|
|
|
通常、 |
|
コマンドラインのすべてのクラスがロードされた後に、必要に応じて、クラス内の外部参照をコンパイルおよび解決します。 |
|
新しくロードされたクラスにバインドされる、明示的なリゾルバ仕様を指定します。 |
|
|
|
スキーマ・オブジェクトを作成するスキーマを指定します。このオプションを指定しないと、
さらに、クラスに対する ノート: 前述の権限を付与すると、SYSスキーマ以外のすべてのスキーマでの表の作成および操作が可能になります。セキュリティ上の理由から、これらの設定は十分に注意して使用することをお薦めします。 |
|
|
|
通常、 |
|
ロードされるクラスに対して |
|
Javaファイルの接続先スキーマではなく、指定したスキーマ内に |
|
|
|
|
|
ユーザー名、パスワードおよびデータベース接続文字列を指定します。ファイルはこのデータベース・インスタンスにロードされます。 |
|
|
|
現在の |
|
|
脚注1
この方法でJARファイルをロードする場合、これを解決や実行に使用することはできません。
脚注2
この方法でJARファイルをロードする場合、これを解決や実行に使用できます。
12.6.3 loadjavaツールの引数の詳細
この項では、動作が複雑なloadjava
ツールの一部の引数について、loadjavaの引数の概要の表よりさらに詳しく説明します。
ファイル名
.class
、.java
、.sqlj
、.jar
、.zip
およびリソース・ファイルは、必要な数だけ任意の順序で指定できます。JARファイルまたはZIPファイルを指定すると、loadjava
ツールは、そのJARまたはZIPでファイルを処理します。JARまたはZIPのスキーマ・オブジェクトはありません。JARまたはZIPに別のJARまたはZIPが含まれていると、loadjava
ツールはこれらのファイルを処理しません。
ファイルのロード方法としては、JARまたはZIPにファイルをまとめ、アーカイブとしてロードすることをお薦めします。アーカイブをロードすることで、リソース・スキーマ・オブジェクトのネーミングの手間を省くことができます。Java Development Kit (JDK)で使用するJARまたはZIPがある場合も、loadjava
ツールでロードでき、この場合、リソース・スキーマ・オブジェクトのネーミングについては知る必要がありません。
スキーマ・オブジェクト名はファイル名とは異なり、loadjava
ツールは異なるタイプのスキーマ・オブジェクトを異なる方法でネーミングします。クラス・ファイルは自己識別できるため、loadjava
ツールによるクラス・ファイル名のスキーマ・オブジェクト名へのマッピングは開発者には表示されません。ソース・ファイル名のマッピングも開発者には表示されません。loadjava
ツールは、ファイル内に定義されている最初のクラスの完全修飾名をスキーマ・オブジェクト名とします。JARファイルとZIPファイルにも、それぞれのファイルの名前が含まれています。
ただし、リソース・ファイルは自己認識できません。loadjava
ツールは、引数で指定したとおりのリテラルなファイル名からJavaリソース・スキーマ・オブジェクト名を生成します。リソース・スキーマ・オブジェクトがクラスで使用され、リソースの正しい指定方法がわかりにくい場合があるため、コマンドラインで正しくリソース・ファイル名を指定することが重要です。
各リソース・ファイルを正確にロードする最善の方法は、パッケージ・ツリーの最上部からloadjava
ツールを実行し、そのディレクトリに相対するリソース・ファイル名を指定する方法です。
ノート:
パッケージ・ツリーの最上部とは、CLASSPATH
で指定するディレクトリです。
この規則に従わない場合は、次のリソース・ファイル・ネーミングに従ってください。リソース・ファイルをロードすると、loadjava
ツールはコマンドラインで指定したとおりのリテラルなリソース・ファイル名からリソース・スキーマ・オブジェクト名を生成します。たとえば、次のように入力した場合:
% cd /home/HR/javastuff % loadjava options alpha/beta/x.properties % loadjava options /home/HR/javastuff/alpha/beta/x.properties
同じファイルを相対パス名と絶対パス名で指定していますが、loadjava
ツールはalpha/beta/x.properties
とROOT/home/HR/javastuff/alpha/beta/x.properties
の2つのスキーマ・オブジェクトを作成します。リソース・スキーマ・オブジェクトの名前は、入力したとおりのファイル名から生成されます。
クラスは、リソース・ファイルを相対的に参照することも絶対的に参照することもできます。loadjava
ツールとクラス・ローダーで同じスキーマ・オブジェクト名を使用するには、クラスからgetResource()
またはgetResourceAsString()
に渡す名前をコマンドラインに入力します。
リソース・ファイルは、次のようにJARでロードできます。この場合、名前をコマンドラインに正しく入力するために、クラスで使用するリソース名が相対名か絶対名かを記憶したり、ディレクトリを変更する必要はありません。
% cd /home/HR/javastuff % jar -cf alpharesources.jar alpha/*.properties % loadjava options alpharesources.jar
処理をさらに簡略化するには、クラス・ファイルとリソース・ファイルの両方をJARで格納します。これによって、次のコマンドを起動しても同じ処理を実行できます。
% loadjava options alpha.jar % loadjava options /home/HR/javastuff/alpha.jar
前述したloadjava
ツール・コマンドは、JARファイルの内容をロードするには任意のパス名が使用できることを示しています。冗長なコマンドを実行した場合でも、loadjava
ツールは、ファイルを2回ロードする必要がないことをダイジェスト表を通じて認識します。したがって、loadjava
ツールの前回の起動後に変更されたファイルが少ない場合でも、JARファイルの再ロードには、考えられているほどの時間はかかりません。
definer
{-definer | -d}
このオプションはストアド・プロシージャにおける定義者権限に相当し、概念的にはUNIXのsetuid
機能に類似しています。ただし、setuid
はプログラム全体に適用されますが、-definer
オプションは各クラスに適用できます。さらに、定義者ごとに異なる権限を付与することもできます。アプリケーションは多数のクラスで構成される場合があるため、意図した結果を得るには、-definer
を注意して適用する必要があります。つまり、クラスに必要以上の権限を付与しないように注意してください。
noverify
[-noverify]
このオプションを指定すると、クラスがバイトコードの検証なしにロードされます。このオプションを実行するには、oracle.aurora.security.JServerPermission(Verifier)
を付与されていることが必要です。また、このオプションは、-resolve
と併用する必要があります。
検証機能によって、形式が無効なJavaバイナリがサーバーにロードされて実行されるのを防止できます。ロードするJARまたはクラスが有効であることが判明している場合は、このオプションによってloadjava
ツールの関連プロセスを高速化できます。検証プロセス時には、解析のパフォーマンスを向上させるためのOracle Database固有の最適化が実行されます。したがって、このオプションを使用すると、アプリケーションの解析のパフォーマンスが低下する場合があります。
optionfile
[-optionfile <file>]
このオプションを使用すると、loadjava
ツールで指定できる各種オプションにファイルを指定できます。このファイルは、他のloadjava
ツール・オプションが処理される前に、loadjava
ツールで読み取られて処理されます。このファイルには1行以上が含まれ、各行にはパターンと一連のオプションが含まれます。各行は、改行文字(\n
)で終了している必要があります。
loadjava
ツールで処理されるファイルまたはJARエントリごとに、作成されるスキーマ・オブジェクトのロング名がパターンと照合してチェックされます。パターンは、任意の文字列を示すワイルドカード(*
)で終了している場合があり、使用しない場合、パターンは名前と完全に一致する必要があります。
一致するJavaスキーマ・オブジェクトに適用されるオプションは、行の後半で指定します。オプションは、コマンドライン・オプションを置換するのではなく、コマンドライン・オプションに追加されます。複数の行が名前と一致する場合、一致する行はパターンの長さが短い順にソートされ、各行のオプションが追加されます。通常、loadjava
ツール・オプションは累積ではありません。後から追加されたオプションは以前のオプションをオーバーライドします。つまり、長いパターンで行に指定されたオプションは、短いパターンで行に指定されたオプションをオーバーライドします。
このファイルは、java.io.StreamTokenizer
で解析されます。
このファイルでJavaのコメントを使用できます。行のコメントは#
で開始します。空の行は無視されます。引用文字には二重引用符("
)を使用してください。つまり、空白を含むオプションは、二重引用符で囲む必要があります。-user
や-verbose
などの特定のオプションは、loadjava
ツールの処理全体に影響を与えますが、個別のJavaスキーマ・オブジェクトに対して実行されるアクションには影響を与えません。このようなオプションがオプション・ファイルに存在する場合は無視されます。
アプリケーションをパッケージ化するために、loadjava
ツールは処理対象の各JARファイルでMETA-INF/loadjava-options
エントリを検索します。このエントリが検出された場合、そのエントリは、JARファイル内の他のすべてのエントリに適用されるオプション・ファイルとして処理されます。ただし、loadjava
ツールは、JARファイルで出現する順にエントリに対する処理を実行します。
loadjava
ツールがMETA-INF/loadjava-options
を処理する前にエントリを部分的に処理した場合、適用可能なオプションに準拠するようにスキーマ・オブジェクトの変更を試みます。たとえば、loadjava
ツールは、定義者権限で作成される必要があったクラスが実行者権限で作成された場合に、そのクラスを変更します。-noaction
に対する修正は、作成済のスキーマ・オブジェクトを削除することです。loadjava
ツールの起動前にスキーマ・オブジェクトが存在していた場合にそれが削除されることを除き、これによって正しい結果が得られます。
optiontable
[-optiontable table_name]
このオプションでは、クラスのプロパティを永続的に指定できます。表をロードする機構はありません。表名には、3つの文字型の列、PATTERN、OPTIONおよびVALUEを含める必要があります。PATTERNの値は、オプション・ファイルのパターンと同様に解釈されます。他の2つの列は、対応するコマンドライン・オプションで、オペランドを取ります。たとえば、次のコマンドを使用して表FOOを作成するとします。
create table foo (pattern varchar2(2000), option_name varchar2(2000), value varchar2(2000));
この場合、optiontable
オプションを次のように使用できます。
loadjava -optiontable foo myjar.jar
オペランドを取らないオプションの場合はVALUE列をNULLにします。表の行は、オプション・ファイルの行と同様に処理されます。特定のスキーマ・オブジェクトのオプションを決定するために行が検査され、一致するとそのオプションがオプション・リストに追加されます。2つの行に、-synonymと-nosynonymなど、同じパターンだが矛盾するオプションがある場合、どちらが優先されるかは不明です。2つの行のパターン列とオプション列が同じである場合、どちらのVALUEが優先されるかは不明です。
publish
[-publish <package>] [-pubmain <number>]
公開オプションを使用すると、loadjava
ツールは処理済のクラスに含まれるメソッドのPL/SQLラッパーを作成します。通常、ユーザーは、JAR内にあるいくつかのクラスのラッパーのみを公開します。このオプションは、オプション・ファイルで指定されている場合に最も役立ちます。
公開可能にするには、メソッドが次の条件を満たす必要があります。
-
メソッドが
public
クラスのメンバーであることが必要です。 -
メソッドを
public
およびstatic
として宣言する必要があります。 -
メソッドのシグネチャは、次の規則を満たしてマップ可能であることが必要です。
-
引数および戻り値のJavaの算術型は、
NUMBER
にマップされます。 -
引数および戻り型として使用される
char
は、VARCHAR
にマップされます。 -
引数および戻り型として使用される
java.lang.String
は、VARCHAR
にマップされます。 -
メソッドの唯一の引数が
java.lang.String
型である場合は、-pubmain
オプションで説明したように、特別な規則が適用されます。 -
戻り型が
void
になると、プロシージャが作成されます。 -
戻り型が算術型、
char
またはjava.lang.String
型の場合は、ファンクションが作成されます。
-
前述の規則に該当しない引数または戻り型を取るメソッドは、適格ではありません。SQL引数のOUT
とIN OUT
、OBJECT
型およびその他多数のSQL機能に対するプロビジョニングはありません。
resolve
{-resolve | -r}
以前ロードしたクラスをloadjava
ツールで強制的にコンパイルおよび解決するには、-resolve
を使用します。解決はロード後に個別に行われるため、-force
を指定する必要はありません。
リゾルバ
{-resolver | -R} resolver_specification
このオプションは、loadjava
ツールが作成または置換したクラス・スキーマ・オブジェクトに明示的なリゾルバ仕様を対応付けます。
リゾルバ仕様は1つ以上の項目で構成されます。各項目の内容は、次の構文で表された名前仕様とスキーマ仕様です。
"((name_spec schema_spec) [(name_spec schema_spec)] ...)"
名前仕様は、import
文における名前に類似しています。Javaの完全修飾クラス名、最終要素がワイルドカード文字のアスタリスク(*
)のパッケージ名、またはアスタリスク(*
)のみを指定できます。ただし、名前仕様の要素間は、ピリオド(.
)ではなくスラッシュ(/
)で区切る必要があります。たとえば、名前仕様a/b/*
は、名前がa.b
で始まるすべてのクラスに一致します。特殊な名前である*
はすべてのクラス名に一致します。
スキーマ仕様として、スキーマ名またはワイルドカード文字のダッシュ(-
)を指定できます。ワイルドカードは、スキーマを特定するものではなく、一致する名前への参照が解決できない場合でもクラスを無効とマークしないように解決処理に対して指示するために使用します。テスト対象のクラスで参照しているクラスをロードできない、またはロードしない場合は、ダッシュ(-
)を使用します。たとえば、クラスでGUIクラスを参照していても、サーバーでの実行時はGUIがないため、このGUIクラスはコールされません。
解決処理では、名前が名前仕様に一致するスキーマ・オブジェクトが、パートナ・スキーマ仕様で指定されているスキーマで検索されます。
この解決処理では、リゾルバ仕様のリスト順にスキーマが検索されます。次に例を示します。
-resolver '((* HR) (* PUBLIC))'
これは、最初にHR
で、次にPUBLIC
で参照を検索することを意味します。参照が解決されない場合は、参照元クラスを無効とマークし、エラー・メッセージを表示します。
次に例を示します。
-resolver "((* HR) (* PUBLIC) (my/gui/* -))"
これは、最初にHR
で、次にPUBLIC
で参照を検索することを意味します。参照先がパッケージmy.gui
内のクラスで、その参照が見つからない場合は、参照元クラスを有効とマークし、エラー・メッセージは表示しません。参照先がmy.gui
内のクラスでなく、その参照が見つからない場合は、参照元クラスを無効とマークし、エラー・メッセージを表示します。
user
{-user | -u} user/password[@database_url]
デフォルトでは、loadjava
ツールは、-user
オプションで指定されたログイン・スキーマにロードされます。別のロード先スキーマを指定するには、-schema
オプションを使用します。そのスキーマにログインする必要はありませんが、スキーマを変更するパーミッションが必要になります。
@
database_url
の使用可能な形式は、次に説明するように、-oci
を指定するか、または-thin
を指定するかによって異なります。
-
-oci:@
database_url
はオプションです。指定しない場合、loadjava
ツールはユーザーのデフォルト・データベースを使用します。指定した場合、database_url
はTNS名またはOracle Net Servicesの名前/値リストのいずれかになります。 -
-thin:@
database_url
は必須です。形式はhost
:
lport
:
SID
です。説明:
-
host
は、データベースが動作しているコンピュータの名前です。 -
lport
は、Oracle Net Services接続のリスニング用に構成されたリスナー・ポートです。デフォルト・インストールでは5521
です。 -
SID
は、データベース・インスタンスの識別子です。デフォルト・インストールではORCL
です。
-
次に、loadjava
ツールのコマンド例を示します。
-
デフォルトのOCIドライバでデフォルト・データベースに接続し、JAR内のファイルを
TEST
スキーマにロードしてから、ファイルを解決する場合loadjava -u joe -resolve -schema TEST ServerObjects.jar Password: password
-
JDBC Thinドライバで接続し、クラス・ファイルとリソース・ファイルをロードして、各クラスを解決する場合
loadjava -thin -u HR@dbhost:5521:orcl \ -resolve alpha.class beta.props Password: password
-
alpha.class
を実行できるユーザー群にBettyとBobを追加する場合loadjava -thin -schema test -u HR@localhost:5521:orcl \ -grant BETTY,BOB alpha.class Password: password
jarsasdbobjects
現在のloadjava
ツールで処理されるJARと、それらに含まれるクラスがデータベースに格納されること、および、クラスとJARとの関連付けに関する情報がデータベースで保持されることを示します。つまり、この引数は、現在のloadjava
ツールで処理されるJARが、データベース常駐JARとしてデータベースに格納されることを示します。
prependjarnames
-jarsasdbobjects
オプションと一緒に使用します。このオプションにより、異なるJARの同じ名前のクラスが同じスキーマ内で共存できます。
関連トピック