eclipse背后的魔力生成了可执行的jar文件

pro*_*eek 6 java jar executable-jar

我可以用Eclipse制作一个可执行的jar文件.假设它被调用ast.jar,Main类是ASTExplorer.我可以验证这是否有效java -jar ast.jar.

然后,我将jar文件解压缩到一个单独的目录中,并验证ASTExplorer是否位于astexplorer目录中.但是当我执行此命令时,java -cp . astexplorer.ASTExplorer我收到此错误.

java -cp . astexplorer/ASTExplorer
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
Run Code Online (Sandbox Code Playgroud)

问题是jar文件中没有org/eclipse/swt目录.

目录截图

可执行jar文件背后的魔力是什么?拉链时为什么不运行?

Jim*_*son 2

当 Eclipse 打包可运行的 jar 时,它包含作为嵌套 jar 文件的依赖项,并且还包含一个特殊的类加载器,它了解如何在嵌套 jar 中查找类。它仅适用于嵌套罐子,当您提取所有内容时,您会阻止它工作。

我查看了 Eclipse 生成的可运行 jar,我认为您需要执行以下操作:

  1. 将所有内容提取到目录中。依赖项 jar 在顶级目录中提取
  2. 删除org/eclipse/jdt/internal目录
  3. 从顶级目录运行您的主类

    java -cp .;dep-jar;dep-jar;... your.main.class

我用我碰巧拥有的一个可运行的罐子尝试了这个,它有效。步骤 2 并不是绝对必要的。