【问题标题】:NetBeans - deploying all in one jar [duplicate]NetBeans - 在一个 jar 中部署所有内容 [重复]
【发布时间】:2011-01-13 20:24:24
【问题描述】:

可能重复:
Put external library to the JAR?

我有 NetBeans 6.8,我写了一个有两个库(jar 文件)的类。 构建它,我得到一个包含我的 project.jar 的“dist”文件夹和一个包含两个 lib jar 文件的“lib”文件夹。

我怎样才能把所有这些都放在一个 jar 文件中? (我不使用 Maven/Ant 或类似的东西。)

【问题讨论】:

标签: java netbeans jar


【解决方案1】:

基本问题是当前版本的Java不支持开箱即用的jars inside。

推荐的解决方案是使用 jar 中 MANIFEST.MF 文件中的 Class-Path 行来指向所需的库(允许使用相对路径),然后将所有文件一起部署并使用“java -jar your.罐子”

如果您真的想要一个“jar-inside-jar”解决方案,我们已经使用 one-jar 好几年了,但由于我们的目标 JVM 使用上述解决方案效果更好,因此不再使用它。

http://one-jar.sourceforge.net/

我将它与 Eclipse 中的 fatjar 插件一起使用。我没有将它构建到 Netbeans 中的任何经验,但是构建到 ant 脚本中很简单,我相信无论如何都是 NETbeans 使用的。

【讨论】:

    【解决方案2】:

    您可以在 build.xml 文件中创建额外的构建目标。 并使用zipfilesetzipgroupfileset 创建一个大罐子 例如

    <target name="YourBigJar" depends="-post-jar">
      <jar destfile="BigJar.jar">
        <zipfileset src="dist/Project1.jar"/>
        <zipfileset src="../OtherProject/dist/project2.jar"/>
        <zipgroupfileset dir="../libs/."/>
      </jar>
    </target>
    

    【讨论】:

    • +1 使用 ant 可能是最好的方法
    • 请注意,这会破坏已签名的 jar 等。
    【解决方案3】:

    我同意 Waverick 的观点。使用 NetBeans 执行此操作的最简单方法是将自定义目标添加到您的 build.xml。 (顺便说一句,由于使用了 NetBeans,您正在使用 Ant,因为 NetBeans 使用 Ant 来构建您的 jar 文件。)

    Waverick 的 Ant 目标似乎旨在将来自不同 NetBeans 项目的编译代码合并到当前项目的 jar 文件中。我下面的目标完全符合您的要求。

    <target name="-unjar-and-copy-lib-jars">
        <unjar dest="${build.classes.dir}">
            <fileset dir="lib">
                <include name="**/*.jar"/>
            </fileset>
            <patternset>
                <exclude name="META-INF/**"/>
                <exclude name="/*"/>
            </patternset>
        </unjar>
    </target>
    
    <target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar">
        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
        <jar destfile="${dist.jar}">
            <fileset dir="${build.classes.dir}"/>
            <manifest>
                <attribute name="Main-Class" value="${main.class}"/>
            </manifest>
        </jar>
        <echo>To run this application from the command line without Ant, try:</echo>
        <property location="${dist.jar}" name="dist.jar.resolved"/>
        <echo>java -jar "${dist.jar.resolved}"</echo>
    </target>
    
    <target depends="clean,fat-jar" name="clean-and-fat-jar"/>
    

    【讨论】:

    • 只要把 改成 就可以了,谢谢 :)
    • 有指向您博客文章的新链接?
    • 没关系,我找到了:Fat Jar from NetBeans
    【解决方案4】:

    您可以使用 Java 使用 Class.getResourceAsStream()FileOutputStream 以编程方式安装外部库。图书馆通常会进入Java\lib\ext\

    我是这样处理的:

    我将我使用的所有 JAR 的副本放入 .res 子包中。从那里,我可以将它们复制到任何地方。

    private void installLibraries() {
        new Thread() {
    
            @Override
            public void run() {
                System.out.println("Checking for libraries");
    
                File jre = new File(System.getProperty("java.home"));
                File jar = new File(jre, "lib/ext/JAR_NAME.jar");
                //Create more File objects that wrap your JAR's
                try {
                    boolean added = false;
    
                    if (!jar.exists()) {
                        copyResource(jar, "JAR_NAME.jar");
                        added = true;
                    }
                    //Repeat for more JAR's
    
                    if (added) {
                        System.out.println("Libraries installed.");
                    } else {
                        System.out.println("Library check complete");
    
                } catch (IOException ex) {
                    System.out.println("Library installation failed.");
                    ex.printStackTrace(System.out);
                }
            }
    
            private void copyResource(File dest, String src) throws IOException {
                System.out.println("Copying resource " + src + " to " + dest);
                InputStream in = THIS_CLASS_NAME.class.getResourceAsStream("/YOUR_PACKAGE/res/" + src);
                dest.getParentFile().mkdirs();
                FileOutputStream out = new FileOutputStream(dest);
                byte[] buffer = new byte[1024];
                int i = 0;
                while ((i = in.read(buffer)) > 0) {
                    out.write(buffer, 0, i);
                }
                out.close();
                in.close();
            }
        }.start();
    }
    

    在执行任何其他操作之前运行此方法,您可以完全忽略 Netbeans 为您提供的外部 JAR 文件,而只需分发该文件。作为附加说明,我使用这种方法安装了javax.comm,它不喜欢被外部分发。它带有一个 .dll 文件和一个属性文件。这些文件可以使用完全相同的方法安装,但值得注意的是.dll 文件必须放在Java\lib\ 目录中,而属性文件必须放在Java\lib\ 目录中(而不是在\ext 文件夹中)。

    【讨论】:

      【解决方案5】:

      我找到了一篇好文章here。但似乎值得一提的是,它要求 dest/lib 文件夹中的外部库。你可以这样做,但通常我们在根文件夹中有 lib 文件夹(或者我有什么)。如果只是改变

      &lt;zipgroupfileset dir="dist/lib" includes="*.jar"/&gt;

      <zipgroupfileset dir="/lib" includes="*.jar"/>. 
      

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2016-11-12
        相关资源
        最近更新 更多