Java 从jar文件中,从实现jar外部类的类调用main方法

Java 从jar文件中,从实现jar外部类的类调用main方法,java,jar,main,Java,Jar,Main,假设我有一个名为“MyJar.jar”的jar文件,其类定义如下: import SomeInterface; public class MyClass implements SomeInterface { static public void main ( String args[] ) { ... } } Main-Class: MyClass 但是请注意,接口“SomeInterface”不在jar文件中。而是在另一个名为“SomeJar.jar”的jar文件中

假设我有一个名为“MyJar.jar”的jar文件,其类定义如下:

import SomeInterface;

public class MyClass implements SomeInterface {
   static public void main ( String args[] ) {
     ...
   }
}
Main-Class: MyClass
但是请注意,接口“SomeInterface”不在jar文件中。而是在另一个名为“SomeJar.jar”的jar文件中引用它

我的清单mf文件包含如下内容:

import SomeInterface;

public class MyClass implements SomeInterface {
   static public void main ( String args[] ) {
     ...
   }
}
Main-Class: MyClass
现在,假设我尝试使用看似可行的语法在jar文件中的这个“MyClass”类上运行“main”方法,即:

java -cp SomeJar.jar -jar MyJar.jar
在这种情况下,我得到如下结果:

Error: Could not find or load main class MyClass
但是,如果我像这样修改语法,一切正常:

java -cp SomeJar.jar;MyJar.jar MyClass
为了进行健全性检查,我使用一个具有适当清单文件条目的“HelloWorld”类执行了前一个调用,并且成功了。似乎只有当所讨论的类实现了一个不能立即用于jar文件的接口,而存在于jar文件之外时,才会出现这个问题。(这种情况也可能发生在一个类的exending上,但我没有检查)正如你所看到的,我可以让事情顺利进行。。。只是我认为“java-jar”语法不起作用。此外,使用前一种方法,无论是否在“java-jar”调用中包含“-cp”类路径,我都不会得到“NoClassDefFoundError”错误(我想我会得到)


有没有想过为什么前一个“java-jar”调用不起作用(并且似乎没有给出任何关于它为什么不起作用的好错误),而后一个“java”调用工作得很好?

-cp
-jar
选项都设置(而不是附加到)底层类路径。命令行最后一个选项将覆盖所有以前的
-cp
-jar
选项。

。所以“-jar”只有在所有东西都可以存在于单个jar文件中,并且/或者在向清单添加外部类路径时感觉没有问题时才有用(即使如果jar部署到不同的环境中,这些类路径可能会改变)。谢谢你的洞察力。是的,基本上是对的。另一个流行的选择是在单个JAR中放入最小的逻辑,以编程方式计算完整的类路径并创建类装入器。这是大多数大型/可扩展应用程序(Eclipse、应用服务器等)使用的方法。