Launch4J - 如何将依赖的jar文件附加到生成的exe文件中

12

我有一个简单的Java项目,需要使用外部jar包。 我使用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>

但似乎只能使用 classpath 来引用我的额外jar包。

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

那么我该如何正确地生成exe文件呢?

感谢您的帮助。


我有使用Eclipse创建可执行jar文件的经验。这个过程非常简单。 - Acewin
谢谢,对我来说没有切换到Eclipse的机会。看起来我必须将所有依赖的jar打包成一个jar,这样就可以解决问题了。 - norbi771
你也可以不切换到Eclipse。问题是你需要一个像.exe这样的可执行文件,还是一个可执行的jar文件就可以了。只需要执行指向类的清单文件。我记得这一点,因为当我遇到同样的问题时,在教程中得到了一些帮助。正如你会注意到的,拥有正确的清单文件才是关键。 - Acewin
感谢您的评论。我确实需要一个exe文件而不是jar文件。 同时,我找到了这个链接http://mavistechchannel.wordpress.com/2010/08/17/how-to-build-a-single-jar-file-with-external-libs/,它帮助我构建了一个包含所有依赖库的单个jar文件。一旦我得到了一个jar文件,我的Lanuch4J生成的exe就可以正常工作了。 - norbi771
是的,这是一个不错的解决方案。生成一个包含所有依赖项的单个工作jar文件,然后使用launch4j生成可执行exe文件。 - Acewin
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/中的文章,我创建了一个Ant脚本来为我构建一个单独的JAR应用程序。 然后,我可以通过Launch4J手动创建exe文件。

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

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

将所有内容放在一起,我附上了包含1、2、3点的Ant构建脚本:

需要编辑build.xml并在“project”结束标记之前插入下面找到的内容。

<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文件,选择:

运行目标 / 其他目标 / package-for-launch4j

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


因为它是一个Ant脚本,所以它可以在Eclipse或命令行中运行。 - Acewin
很高兴知道。此外,在NetBeans中,可以创建快捷方式(右键单击在build.xml中展开的ant目标),因此无需通过“运行目标/其他目标/打包以供launch4j使用”进行操作。 - norbi771

6
当您转换您的.jar文件时:
  1. 进入classpath选项卡
  2. 勾选自定义classpath
  3. 在主类中选择您从项目构建后的dist文件夹中选择您的.jar文件
  4. 在classpath文本区域中添加您的库,您可以在该文本框下方添加它们,写入库的完整路径(当然包括库,即“C:\folder\lib\file.jar”)

示例


3

我花了几个小时来解决这个问题,现在我来做出贡献。

问题是:如何成功地将你的外部JAR文件放入生成的.EXE文件中,以便你的.JAR程序可以使用它们。

我们假设你已经正确地在eclipse/netbeans上配置了外部JAR文件,并且使用命令"java -jar yourprogram.jar"时一切正常。

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

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

2) 安装JSmooth,我建议你使用Windows版本。

3) 在左侧菜单中有一个名为“Application”的按钮。点击它。

4) 你会看到一个名为“Classpath”的选项卡面板。点击加号(+)并添加你的外部.JAR文件。就这样!

不要忘记勾选“use am embedded jar”复选框,并正确选择主类。它会工作的。


2

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

  1. 下载并安装launch4j。

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

  3. 确保您的项目目录中有一个名为“dist”的文件夹。 它将具有带有lib文件夹(包含相关库)的jar文件。
  4. 打开launch 4j。
  5. 在dist文件夹中创建输出文件。 例如:OutputFile:D:******\My_App\dist\my_application.exe
  6. 在下一行中浏览您的jar文件。 例如:Jar:D:******\My_App\dist\my_application.jar
  7. 转到classpath选项卡。 选择CustomClasspath。 单击浏览图标,并浏览到位于dist文件夹中的jar文件。
  8. 在JRE选项卡中指定Min Jre版本。
  9. 保存配置。
  10. 通过单击设置图标构建包装器
  11. 您的exe文件将在dist文件夹中生成。 就是这样 :)


0
在launch4j中,转到类路径选项卡。勾选自定义类路径字段。在编辑字段中,输入您想要包含的每个jar的完整路径并按接受。完成后,只需在单独的字段中键入主类的名称(即MyProg)。所有的jar现在都将包含在exe中。
PS:我把所有的jar都放在同一个目录下。我正在使用3.12版本。

0
使用Launch4j包含外部库,您必须在.exe文件旁边拥有外部库的“.jar”文件(我的只是在同一个文件夹中),然后在“Classpath”中将.jar文件的路径放入“Edit Item:”中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接