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

Java eclipse生成的可执行jar文件背后的魔力,java,jar,executable-jar,Java,Jar,Executable Jar,我可以用Eclipse制作一个可执行的jar文件。假设它被称为ast.jar,主类是ASTExplorer。我可以用java-jar ast.jar验证这一点 然后,我将jar文件解压缩到一个单独的目录中,并验证ASTExplorer是否在ASTExplorer目录中。但是当我执行这个命令java-cp时。astexplorer.astexplorer我收到这个错误 java -cp . astexplorer/ASTExplorer Exception in thread "main" jav

我可以用Eclipse制作一个可执行的jar文件。假设它被称为
ast.jar
,主类是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)
问题是jar文件中没有org/eclipse/swt目录


可执行jar文件背后的魔力是什么?为什么解压时它不运行?

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

我已经查看了Eclipse生成的可运行jar,下面是我认为您需要做的:

  • 将所有内容提取到目录中。依赖项jar在顶级目录中提取
  • 删除org/eclipse/jdt/internal目录
  • 使用从顶级目录运行主类

    java-cp。;dep-jar;dep jar;。。。您的.main.class


  • 我用一个可以运行的罐子试了一下,碰巧我的周围有一个罐子,它能工作。第2步不是绝对必要的。

    您应该尝试使用ant创建JAR,而不使用eclipse黑魔法。当您运行
    java-JAR ast.JAR
    时,您的类路径是什么。当您解压缩jar文件时,您的类路径是
    。我猜有一个环境变量CLASSPATH被设置为允许
    java-jar ast.jar
    工作的东西。我可以使用-cp执行它:ECLIPSE main.class中的所有jar文件。我认为eclipse生成的可执行jar文件背后似乎没有什么神奇之处,只是将其包装起来,并自动引用jar文件,从而替换mainfest文件中的“jarinjar”类加载器。