Java Launch4J-如何将依赖JAR附加到生成的exe

Java Launch4J-如何将依赖JAR附加到生成的exe,java,jar,launch4j,Java,Jar,Launch4j,我有一个简单的java项目,它需要外部JAR。 我使用netbeans构建它,在Clean和build命令之后,我可以在dist目录中找到以下结构: -myApp.jar -lib/ library1.jar library2.jar 我会说,这是典型的 现在,我想将myApp.jar和相关库作为一个exe分发。 这可能吗?我正在尝试使用Launch4J。在我创建配置文件的GUI中,cp部分有一些选项 lib/swing-layout-1.0.4.jar 但它似乎是类路径

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

-myApp.jar
-lib/
     library1.jar
     library2.jar
我会说,这是典型的

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

lib/swing-layout-1.0.4.jar
但它似乎是类路径,并且它是我唯一可以参考我的额外jar的地方

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

那么我怎样才能正确地创建exe文件呢


谢谢你的帮助。

将帮助过我的地方链接起来

最重要的是

快速啧啧


由于经常发生无法解决问题的情况,我将其发布在StackOverflow上。。。发表这个问题后不久,我有了一个想法

因此,我的问题的答案是:

将所有相关罐子放入一个主罐子。

我花了一些时间来寻找信息,我怎么能做到这一点

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

  • 下面的文章是我创建的ant脚本,它为我构建了一个jar应用程序。 然后我可以通过Launch4J手动创建exe

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

  • 然后我意识到我必须在我的自动任务(在第2点)之前完成“清理和构建”,我决定在exe构建之前自动完成清理和构建

  • 总而言之,我附加了我的ant构建脚本,包括点1、2、3:

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

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


    exe文件夹中的exe文件已准备就绪:-)

    我已为此问题花费了数小时。这就是我的贡献

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

    我们假设您已经在eclipse/netbeans上正确地配置了外部jar,并且所有这些都可以使用命令java-jaryourprogram.jar正常工作

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

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

    2) 安装JSmooth,我建议您使用windows版本

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

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


    不要忘了将.jar应用程序标记复选框“UseAmEmbeddedJAR”并正确选择主类。将.jar迁移到exe时,我也遇到了同样的问题。我也有很多依赖库。我执行了以下步骤:

  • 下载并安装launch4j

  • 在netbeans中打开您的项目。清洁和建设项目

  • 确保项目目录中有一个名为“dist”的文件夹。它将有您的jar文件和lib文件夹(包含依赖库)
  • 打开发射4j
  • 在dist文件夹中创建输出文件。例如:OutputFile:D:*****\My\u App\dist\My\u application.exe
  • 浏览下一行中的jar文件。例如:Jar:D:*****\My\u App\dist\My\u application.Jar
  • 转到类路径选项卡。勾选CustomClasspath。按browse图标,然后浏览到位于dist文件夹中的jar文件
  • 在Jre选项卡中指定最小Jre版本
  • 保存配置
  • 构建包装(通过单击设置图标)
  • 您的exe文件将在dist文件夹中生成。 就这样:)

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

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


    PS我所有的JAR都在同一个目录中。转换.jar文件时,我使用的是3.12版

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

  • 我有使用Eclipse创建可执行jar的经验。这里的过程很简单。谢谢,我没有机会切换到Eclipse。似乎我必须将所有依赖的jar打包到一个jar中,这将解决这个问题。您也可以不用切换到eclipse。问题是你们需要像.exe这样的可执行文件还是一个可执行jar就可以了。它是唯一需要执行的指向类的清单文件。我记得这一点,因为当我在同一个问题上时,我在图坦卡蒙中学得到了一些帮助。正如您将注意到的,拥有正确的清单文件是您评论的关键所在。我肯定需要一个exe文件,而不是jar。实际上
    <cp>lib/swing-layout-1.0.4.jar</cp>
    
    <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>