2016-07-27 11 views
1

Microsoft Windows OSで指定されたメインクラスを開始するために、クラスパスに含まれる複数の*.jarファイルがフォルダ内にあります。これは、現在、このように実現されます。アプリケーションの起動時にクラスパス内のクラスまたはパッケージを除外します

@echo off 
java -Xmx1024M -cp libs/*;. org.test.Main 

は今、私はlibsフォルダ内の2つのJARファイルがあることを、問題を持って、両方が1つの同じパッケージorg.test.configurationを持っていること。両方とも異なっていて、プログラムを起動すると、間違ったものがJava VMによって選択されるため、エラーが発生します。

スタートスクリプト内で1つの特別なパッケージまたは1つの特別なクラスを除外するにはどうすればよいですか? (もちろん、このパッケージを間違ったjarファイルから削除することもできますが、このメソッドを使用したくない...)

答えて

2

Javaはパッケージ/クラスのクラスパスを順番に検索します。代わりにワイルドカードを使用する...

java -Xmx1024M -cp libs/*;. org.test.Main 

...最初の「正しい」org.test.configurationパッケージを含むJARと、所望の順序でクラスパスを書き出します。

java -Xmx1024M -cp libs/test-config.jar;libs/other.jar;libs/etc.jar;. org.test.Main 

編集

あなたは明示的に最初に目的のjarファイルをリストアップし、それをクラスパスに複製を取得させることで、ワイルドカードを使用して、まだ逃げることができるかもしれません:

java -Xmx1024M -cp libs/test-config.jar;libs/*;. org.test.Main 

ここにはMinimal, Complete, Verifiable Example

(main.jarで)Main.java \

ORG \試験:

package org.test; 

import org.test.configuration.Config; 

public class Main { 

    public static void main(String[] args) { 
     Config cfg = Config.getConfig(); 
     System.out.println(cfg); 
    } 
} 

ORG Config.java \テスト\構成\(config1.jarで):

package org.test.configuration; 

public class Config { 
    public static Config getConfig() { 
     return new Config(); 
    } 
} 

ORGテスト\ (config2.jar中)Config.java \ \設定:

package org.test.configuration; 

public class Config { 
    public static Config getConfig() { 
     return null; 
    } 
} 

のjava -cpのlibs \ * ;. org.test.Main
[email protected]

java -cp libs \ config2.jar; libs \ * ;.ちょうどlibs\*クラスパスでの使用org.test.Main
ヌル

は、最初に含まれているconfig1.jarの結果、ライブConfigオブジェクトが返されました。 libs\config2.jar;libs\*を使用すると、最初にconfig2.jarのConfigが含まれ、nullが返されました。

+0

私はすでにこれを試しましたが、残念ながら成功しませんでした。私はもう一方の前にconfig.jarを入れてみました。しかし、それは唯一の誤った瓶が読み込まれています。私はもちろん、configクラスが同じパッケージ内の両方のjarファイルにあることを確認しました。間違ったものがNULLオブジェクトを返すので、私はテストできます。そして、サーバーを起動すると、常にNullpointerExceptionが発生します。 Javaは、他のconfigクラスを使用するかどうか、動作する完全な関数オブジェクトがあります。しかし、Javaは間違ったものだけを読み込みます... – christopher2007

+0

[mcve]を追加しました。クラスパス上のjarsの順序を変更すると、複数のjarsに同じ実装の異なる実装が含まれている場合にJVMによって使用されるJAR /パッケージ/クラス。あなたの問題の原因となる他の要因があるはずです。 – AJNeufeld

+0

問題が見つかりました: "本当の"設定JARファイルがmaven 'pom.xml'に含まれていませんでした。生成されたJARファイルには両方ともconfigクラスがありましたが、他のすべてのプロジェクトには間違ったconfigクラスが依存として含まれていました。だから私はクラスパスに "本当の"設定クラスを持ってきましたが、間違ったものがまだ使われていました。 jarファイルをビルドしても、mavenはまだpom.xmlに注意を払っているようです。なぜなら、依存関係として正しいものを追加すると、私たちはあなたが言っていることを正確に行っているからです。しかし、まだ私は懐疑的です。だから、私はこの見解で正しいのですか? – christopher2007

関連する問題