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
が返されました。
私はすでにこれを試しましたが、残念ながら成功しませんでした。私はもう一方の前にconfig.jarを入れてみました。しかし、それは唯一の誤った瓶が読み込まれています。私はもちろん、configクラスが同じパッケージ内の両方のjarファイルにあることを確認しました。間違ったものがNULLオブジェクトを返すので、私はテストできます。そして、サーバーを起動すると、常にNullpointerExceptionが発生します。 Javaは、他のconfigクラスを使用するかどうか、動作する完全な関数オブジェクトがあります。しかし、Javaは間違ったものだけを読み込みます... – christopher2007
[mcve]を追加しました。クラスパス上のjarsの順序を変更すると、複数のjarsに同じ実装の異なる実装が含まれている場合にJVMによって使用されるJAR /パッケージ/クラス。あなたの問題の原因となる他の要因があるはずです。 – AJNeufeld
問題が見つかりました: "本当の"設定JARファイルがmaven 'pom.xml'に含まれていませんでした。生成されたJARファイルには両方ともconfigクラスがありましたが、他のすべてのプロジェクトには間違ったconfigクラスが依存として含まれていました。だから私はクラスパスに "本当の"設定クラスを持ってきましたが、間違ったものがまだ使われていました。 jarファイルをビルドしても、mavenはまだpom.xmlに注意を払っているようです。なぜなら、依存関係として正しいものを追加すると、私たちはあなたが言っていることを正確に行っているからです。しかし、まだ私は懐疑的です。だから、私はこの見解で正しいのですか? – christopher2007