请考虑以下代码:
// App.java
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.SimpleName;
public class App
{
public static void main(String[] args)
{
ASTVisitor visitor = new ASTVisitor()
{
public boolean visit(VariableDeclarationFragment node)
{
return false;
}
public boolean visit(SimpleName node)
{
return false;
}
};
}
}
成功编译:
$ javac -cp org.eclipse.jdt.core.jar App.java
库org.eclipse.jdt.core.jar
是从最新版本的Eclipse复制而来的。运行此程序时:
$ java App -cp org.eclipse.jdt.core.jar
我收到以下运行时错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jdt/core/dom/ASTVisitor
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
...
实际上这是另一个测试程序的精简版本,其中依赖项由Maven管理,并给出相同的错误。寻找解决方案,我发现这可能与缺少依赖关系或未按正确顺序加载的依赖关系有关。但是,我不明白这是怎么回事。检查用过的罐子我得到了:
$ jar tf org.eclipse.jdt.core.jar | grep ASTVisitor
org/eclipse/jdt/core/dom/DefaultASTVisitor.class
org/eclipse/jdt/core/dom/ASTVisitor.class
org/eclipse/jdt/internal/compiler/ASTVisitor.class
所以实际的课程确实存在。除此之外,我尝试按this link的建议加载一堆相关的类,然后我再次尝试加载Eclipse安装附带的所有JDT类,但遗憾的是没有结果。
可能是什么问题以及我还能做些什么来追踪它?
非常感谢。
答案 0 :(得分:1)
' -cp'必须在要在' java'上运行的类之前指定选项。命令:
java -cp org.eclipse.jdt.core.jar App
你在课程名称后面放的任何内容都只是作为参数传递给程序。
答案 1 :(得分:0)
感谢greg-449发现命令行使用错误。在修复之后,我能够成功运行该示例。
经过其他一些试验后,我发现由于某些原因,这些使用Eclipse JDT的程序即使在成功编译后也无法运行,除非我在类路径中添加直接从实际Eclipse安装中获取的jar。这意味着在将Eclipse jar添加到类路径之后,我可以成功运行使用Maven依赖项编译的程序(更复杂的程序):
$ cd my-project/
$ mvn install
$ cd target
$ java -cp "myprogram.jar:../lib/*" path.to.my.main.Class
其中lib
包含来自Eclipse安装的一堆jar。
实际上根本没有必要链接Eclipse jar文件。事实上,使用maven-exec-plugin
而不是直接调用java
命令时,一切正常:
$ mvn exec:java -Dexec.mainClass=path.to.my.main.Class
稍微考虑一下,现在看来,当我调用命令~/.m2
时,Maven会自动链接项目依赖项的jar文件,这些文件在安装期间在mvn exec:java
下载。可能我可以得到相同的结果,将~/.m2
中存储的jar添加到类路径中,而不是手动复制Eclipse安装提供的那些。