【问题标题】:The magic behind the eclipse generated executable jar fileeclipse生成可执行jar文件背后的魔力
【发布时间】:2012-09-16 09:37:28
【问题描述】:

我可以用 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 文件背后的魔力是什么?为什么解压后不运行?

【问题讨论】:

  • 你应该尝试用 ant 创建你的 JAR,不要使用 eclipse 黑魔法。
  • 当你运行java -jar ast.jar 时你的类路径是什么。当你解压 jar 文件时,你的类路径是 .。我猜有一个环境变量 CLASSPATH 设置为允许java -jar ast.jar 工作的东西。

标签: java jar executable-jar


【解决方案1】:

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

我查看了一个 Eclipse 生成的可运行 jar,我认为您需要这样做:

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

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

我用一个碰巧躺在身边的可运行罐子尝试了这个,它可以工作。第 2 步并非绝对必要。

【讨论】:

  • 我可以使用 -cp .:ALL THE JAR FILES FROM ECLIPSE main.class 让它执行。我认为 eclipse 生成的可执行 jar 文件背后似乎没有什么大魔法,除了将其包装起来并自动引用 jar 文件
  • 加上替换 mainfest 文件中的“jarinjar”类加载器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2016-01-14
  • 2023-04-02
相关资源
最近更新 更多