トップレベルMain class
内の同じ依存関係ライブラリ(jars
)の2つの異なるバージョンを呼び出そうとしています。そこで私は2つの実装クラスを持つインターフェイスを作成しました。どちらのクラスも共通のAPIを使用するrunメソッドを持っています。somejar-1.0.0-SNAPSHOT.jar
を使用し、もう一方は明示的にClassLoaderを呼び出してsomejar-2.0.0-SNAPSHOT.jar
を使用します。ここでjava.lang.NoSuchMethodException Java
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassLoader loader1 = new URLClassLoader(new URL[] { new File("/Users/haddad/.m2/repository/com/company/somejar-1.0.0-SNAPSHOT.jar").toURL() });
ClassLoader loader2 = new URLClassLoader(new URL[] { new File("/Users/haddad/.m2/repository/com/company/somejar-2.0.0-SNAPSHOT.jar").toURL() });
Class<?> c1 = loader1.loadClass("com.engine.na.EngineV1");
Class<?> c2 = loader2.loadClass("com.engine.na.EngineV2");
IEngine app1 = (IEngine) c1.newInstance();
IEngine app2 = (IEngine) c2.newInstance();
Integer s1 = app1.run();
Integer s2 = app2.run();
Assert.equals(s1,s2,"Outputs from somejar-1.0 and somejar-2.0 did not match, perhaps somejar-2.0 has regressed?");
}
はインタフェースとEngineV1とV2です:私はメインクラスを実行するために行くとき
public Interface IEngine {
Integer run();
}
public class EngineV1 implements IEngine {
private File content;
private File en;
public EngineV1(args) {
this.content = new File("/some/path");
this.en = new File("/some/path");
}
public static void main(String[] args) {
new EngineV1(args).run();
}
public Integer run() {
// some logic...
somejar.evaluateSpeed();
}
}
public class EngineV2 implements IEngine {
private File content;
private File en;
public EngineV2(args) {
this.content = new File("/some/path");
this.en = new File("/some/path");
}
public static void main(String[] args) {
new EngineV2(args).run();
}
public Integer run() {
// some logic...
somejar.evaluateSpeed();
}
}
私が手:私はこのエラーが出るのはなぜ
Exception in thread "main" java.lang.InstantiationException: com.engine.na.EngineV1
at java.lang.Class.newInstance(Class.java:427)
at com.engine.na.MainClass.main(MainClass.java:23)
Caused by: java.lang.NoSuchMethodException: com.engine.na.EngineV1.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 1 more
?これを解決するには?
は、あなたのクラスのデフォルトコンストラクタを与えます。 – pvg
Javaは、EngineV1とEngineV2の引数なしコンストラクタを暗黙的に作成しませんか? – mosawi
はいJavaはコンパイル時にあなたのためにそれを生成しますが、私はEngineV1に引数なしのコンストラクタを宣言すると思います。 – davidxxx