18

アプリケーションとそのアプリケーションの構成ファイルを含む JAR ファイルがあります。アプリケーションは ( を使用して) クラスパスから構成ファイルをロードClassLoader.getResource()し、JAR ファイルに焼き付けられた構成ファイルを使用して依存関係を完全に満たします。

場合によっては、アプリケーションをわずかに異なる構成で実行したい (具体的には、別のデータベースを指すように JDBC URL をオーバーライドしたい) ため、新しい構成ファイルを作成し、正しいディレクトリ構造に保存します (つまり、クラスパスエントリのディレクトリ/config)、そして私は次のようなことをしたい:

java -cp new-config:. -jar application.jar

しかしnew-config、アプリケーションの JAR のコンテンツの前にパス エントリを持つクラスパスを取得できません。JAR のコンテンツが常にクラスパスの最初のものになるようにハードコーディングされていますか?

4

4 に答える 4

21

-jar を指定せずにアプリケーションを起動し、代わりにアプリケーションのメイン クラスを明示的に指定しないのはなぜでしょうか? これにより、 new-config と application.jar の両方を必要な順序でクラスパスに配置できます。

例 (「new-config」がオーバーライドされたプロパティ ファイルを含むディレクトリであると仮定します)

java -cp new-config:application.jar Application.Main.Class

メインクラスの名前は、jar内のMANIFEST.MFファイルにあると思います....

于 2009-11-10T15:15:44.110 に答える
13

-jar オプションを使用してアプリケーションを起動する場合:

... JAR ファイルはすべてのユーザー クラスのソースであり、他のユーザー クラス パス設定は無視されます。

ここで説明されているように。回避策は、jar ファイルのマニフェストでクラスパスを指定して、追加のパスを含めることです (ここで説明します)。

ただし、構成の修正についてのみ話していることを考えると、クラスパスに依存しない別のアプローチを取りたいと思うかもしれません。たとえば、私は通常、プロパティ ファイルを使用して Spring を介してアプリケーションを構成し、データベースなどの場所を決定します。私の Spring 構成は、テスト、QA、およびライブ環境全体で一貫していますが、アプリを起動するときにコマンド ライン引数として別のプロパティ ファイルを渡します。 .

Spring 構成スニペット

<bean id="MyDataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
    <property name="url" value="jdbc:microsoft:sqlserver://${dbServer}:${dbPort};DatabaseName=${dbName}"/>
    <property name="username" value="${dbUserName}"/>
    <property name="password" value="${dbPassword}"/>
    <property name="suppressClose" value="false"/>
</bean>

プロパティ ファイルのスニペット

dbServer=MyServer
dbPort=1433
dbName=MyDb
dbUserName=Me
dbPassword=foobar
于 2009-11-10T15:19:39.990 に答える
3

-jar オプションで指定された JAR アーカイブは、他のすべての値をオーバーライドします。

通常、外部の構成ファイルを使用して行うか、独自のソリューションを withod で構築する必要がありますClassLoader.getResource()

これを解決するためにカスタム ソリューションを使用します。次のように内部プロパティを読み込みます。

final Properties p = new Properties();
p.load(DefaultConfiguration.class.getResourceAsStream("config.properties"));

次に、同じ方法で外部ファイルをロードし、内部値を外部値で上書きします。

クラスのロードの仕組みについては、次を参照してください。

http://java.sun.com/javase/6/docs/technotes/tools/findingclasses.html

于 2009-11-10T15:11:52.883 に答える
1

CLASSPATH だけを使用することはできない場合があります。ClassLoader.getResource()静的パスを使用してリソースを見つけるための呼び出しを行う方法があります 。そうしている場合は、CLASSPATH をバイパスしています。

于 2009-11-10T15:05:22.790 に答える