12

我有一个简单的 java 项目,它需要外部 jars。我用 netbeans 构建它,在 Clean and Build 命令之后,我可以在 dist 目录中找到以下结构:

-myApp.jar
-lib/
     library1.jar
     library2.jar

典型的,我会说。

现在,我想将带有依赖库的 myApp.jar 作为一个 exe 分发。这可能吗?我正在尝试使用 Launch4J。在我创建配置文件的 GUI 中, cp部分中有一些选项

<cp>lib/swing-layout-1.0.4.jar</cp>

但它似乎是类路径,它是我唯一可以引用我的额外罐子的地方。

创建exe文件后,我在exe中找不到依赖库(exe可以用winrar打开),因此我的应用程序崩溃了。

那我怎样才能正确地制作exe文件呢?

谢谢你的帮助。

4

7 回答 7

16

因为它经常无法解决问题,所以我在 StackOverflow 上发布了它......并且在发布问题后不久我就有了一个想法。

所以我的问题的答案是:

将所有依赖的 jar 放入一个主 jar。

我花了一些时间来查找信息我该怎么做。

为了帮助人们,我决定在这里发布详细说明——它们基于 Netbeans 7.4。

  1. 以下来自http://mavistechchannel.wordpress.com/2010/08/17/how-to-build-a-single-jar-file-with-external-libs/的文章我创建了构建 one-jar- 的 ant 脚本适合我的应用程序。然后我可以通过 Launch4J 手动创建 exe

  2. 然后我决定我想要更自动化的任务,我做到了,Ant 为我构建了 exe(通过 Launch4J)

  3. 然后我意识到我必须在我的自动化任务之前做“清理和构建”(在第 2 点)/我决定我希望在 exe 构建之前自动完成清理和构建

总而言之,我附上了由点 1、2、3 组成的我的 ant 构建脚本:

需要编辑 build.xml 并将下面找到的内容放在“项目”结束标记之前

<target name="package-for-launch4j" depends="clean,compile,jar">
    <property name="launch4jexe.dir" location="C:\Program Files (x86)\Launch4j" />
    <taskdef name="launch4j"
             classname="net.sf.launch4j.ant.Launch4jTask"
             classpath="${launch4jexe.dir}/launch4j.jar
            :${launch4jexe.dir}/lib/xstream.jar" />
    <property name="launch4j.jar.name" value="MyAppJarName"/>
    <property name="launch4j.dir" value="exe"/>
    <property name="launch4j.jar" value="${launch4j.dir}/${launch4j.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${launch4j.jar}"/>
    <delete dir="${launch4j.dir}"/>
    <mkdir dir="${launch4j.dir}"/>
    <jar destfile="${launch4j.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
        <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <zip destfile="${launch4j.jar}">
        <zipfileset src="${launch4j.dir}/temp_final.jar"
            excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>
    <delete file="${launch4j.dir}/temp_final.jar"/>
    <launch4j configFile="misc/l4j-myapp.xml" />
</target>

然后在 Netbeans 中右键单击 build.xml 并选择:Run Target / Other Targets / package-for-launch4j

exe文件已在exe文件夹中准备好:-)

于 2013-11-12T02:02:36.487 回答
4

当您转换 .jar 文件时

  1. 转到类路径选项卡
  2. 检查自定义类路径
  3. 在构建项目后,在主类上从 dist 文件夹中选择您的 .jar
  4. 在类路径 textarea 添加您的库,您将它们添加到该 textarea 的正下方,写入 lib 的完整路径(当然包括 lib,即“C:\folder\lib\file.jar”)

例子

于 2019-05-05T16:45:21.937 回答
2

我在这个问题上花了几个小时。所以这是我的贡献。

这里的问题是:如何成功地将您的 .JAR 程序需要的外部 jar 放入您生成的 .exe 中。

我们假设您已经正确地在 eclipse/netbeans 上配置了外部 jar,并且使用以下命令一切正常:java -jar yourprogram.jar。

所以真正的问题是如何确保这个 .EXE 文件将包含外部 jar,否则将无法正常工作。

1) 首先,您需要忘记 Launch4J 和任何其他程序。

2)安装JSmooth,我推荐你使用windows版本。

3) 在左侧菜单上有一个“应用程序”按钮。点击它。

4)您将看到一个选项卡“类路径”面板。单击加号 (+) 并添加您的外部 .jar 文件。就是这样!!

不要忘记将您的 .jar 应用程序标记复选框“使用嵌入式 jar”并正确选择主类。它会起作用的。

于 2016-04-13T05:04:08.683 回答
2

在将 .jar 迁移到 exe 时,我也遇到了同样的问题。我也有很多依赖库。所以这些是我执行的步骤:

  1. 下载并安装launch4j。

  2. 在 netbeans 中打开您的项目。清理并构建项目。

  3. 确保在项目目录中有一个名为“dist”的文件夹。它将有你的 jar 文件和 lib 文件夹(包含依赖库)。
  4. 打开启动 4j。
  5. 在 dist 文件夹中创建输出文件。例如:输出文件:D:******\My_App\dist\my_application.exe
  6. 在下一行浏览您的 jar 文件。例如:罐子:D:******\My_App\dist\my_application.jar
  7. 转到类路径选项卡。勾选自定义类路径。按浏览图标,然后浏览到位于 dist 文件夹中的 jar 文件。
  8. 在 JRE 选项卡中指定 Min Jre 版本。
  9. 保存配置。
  10. 构建包装器(通过单击设置图标)
  11. 您的 exe 文件将在 dist 文件夹中生成。就是这样 :)
于 2018-06-15T13:34:07.700 回答
0

要在 Launch4j 中包含外部库,您必须在 .exe 附近拥有外部库的“.jar”文件(我的只是在同一个文件夹中),然后在“Classpath”中将 .jar 文件的路径放入“编辑项目:“

于 2018-06-22T03:06:16.447 回答
0

在 launch4j 中,转到类路径选项卡。勾选自定义类路径字段。在编辑字段中,输入要包含的每个 jar 的完整路径,然后按接受。完成后,只需将主类的名称输入单独的字段(即 MyProg)。现在所有的 jar 都将包含在 exe 中。

PS我所有的罐子都在同一个目录下。我正在使用版本 3.12

于 2019-04-10T11:14:57.167 回答