Eclipse JDT class 未找到 ASTVisitor
Eclipse JDT class ASTVisitor not found
考虑以下代码:
// 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
所以实际的 class 确实存在。除此之外,我尝试按照 this link 的建议加载一堆相关的 classes,然后我再次尝试加载 Eclipse 安装附带的所有 JDT classes,但是很遗憾没有结果。
可能是什么问题,我还能做些什么来追踪它?
非常感谢。
必须在 class 之前指定 '-cp' 选项,您希望在 'java' 命令上 运行:
java -cp org.eclipse.jdt.core.jar App
您放在 class 名称后的任何内容都将作为参数传递给程序。
感谢 greg-449 发现命令行使用错误。修复该问题后,我能够成功 运行 该示例。
经过一些其他的尝试,我发现,出于某种原因,这些使用 Eclipse JDT 的程序即使在成功编译后也无法 运行,除非我将 jars 添加到 class 路径直接取自实际的 Eclipse 安装。这意味着在我将 Eclipse jar 添加到 class 路径后,我可以成功 运行 使用 Maven 依赖项编译我的程序(更复杂的程序):
$ cd my-project/
$ mvn install
$ cd target
$ java -cp "myprogram.jar:../lib/*" path.to.my.main.Class
其中 lib
包含一堆来自我的 Eclipse 安装的 jar。
编辑
实际上根本没有必要 link Eclipse jar 文件。事实上,当使用 maven-exec-plugin
而不是直接调用 java
命令时一切正常:
$ mvn exec:java -Dexec.mainClass=path.to.my.main.Class
稍微考虑一下,现在看来很明显 Maven 会自动 links 项目依赖项的 jar 文件,在安装期间在 ~/.m2
中下载,当我调用命令 [=16] =].可能我可以获得相同的结果,将存储在 ~/.m2
中的 jar 添加到 class 路径,而不是手动复制我的 Eclipse 安装提供的那些。
考虑以下代码:
// 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
所以实际的 class 确实存在。除此之外,我尝试按照 this link 的建议加载一堆相关的 classes,然后我再次尝试加载 Eclipse 安装附带的所有 JDT classes,但是很遗憾没有结果。
可能是什么问题,我还能做些什么来追踪它?
非常感谢。
必须在 class 之前指定 '-cp' 选项,您希望在 'java' 命令上 运行:
java -cp org.eclipse.jdt.core.jar App
您放在 class 名称后的任何内容都将作为参数传递给程序。
感谢 greg-449 发现命令行使用错误。修复该问题后,我能够成功 运行 该示例。
经过一些其他的尝试,我发现,出于某种原因,这些使用 Eclipse JDT 的程序即使在成功编译后也无法 运行,除非我将 jars 添加到 class 路径直接取自实际的 Eclipse 安装。这意味着在我将 Eclipse jar 添加到 class 路径后,我可以成功 运行 使用 Maven 依赖项编译我的程序(更复杂的程序):
$ cd my-project/
$ mvn install
$ cd target
$ java -cp "myprogram.jar:../lib/*" path.to.my.main.Class
其中 lib
包含一堆来自我的 Eclipse 安装的 jar。
编辑
实际上根本没有必要 link Eclipse jar 文件。事实上,当使用 maven-exec-plugin
而不是直接调用 java
命令时一切正常:
$ mvn exec:java -Dexec.mainClass=path.to.my.main.Class
稍微考虑一下,现在看来很明显 Maven 会自动 links 项目依赖项的 jar 文件,在安装期间在 ~/.m2
中下载,当我调用命令 [=16] =].可能我可以获得相同的结果,将存储在 ~/.m2
中的 jar 添加到 class 路径,而不是手动复制我的 Eclipse 安装提供的那些。