Java 如何将库与我的jar相结合?

Java 如何将库与我的jar相结合?,java,jar,Java,Jar,我写了一个利用第三方开源库的程序,我想把它和我的程序打包在一个jar中。我使用的是netbeans 6.8,所有我尝试过的java都会返回错误: java.lang.NoClassDefFoundError: libraryname; 离题:如果可能的话,我还想知道如何通过netbeans制作一个可执行的jar(exe)。(我见过用java编写的程序,但都是.exe) EDIT发现了一个名为FatJar的eclipse插件,它可以做我想做的事情,但我找不到类似的netbeans插件,有这样的东

我写了一个利用第三方开源库的程序,我想把它和我的程序打包在一个jar中。我使用的是netbeans 6.8,所有我尝试过的java都会返回错误:

java.lang.NoClassDefFoundError: libraryname;
离题:如果可能的话,我还想知道如何通过netbeans制作一个可执行的jar(exe)。(我见过用java编写的程序,但都是.exe)


EDIT发现了一个名为FatJar的eclipse插件,它可以做我想做的事情,但我找不到类似的netbeans插件,有这样的东西吗?

要在jar中包含另一个jar,您可能会发现它很有用


如果我没弄错的话,可执行JAR只有一个定义为“Main”的类

如果没有
许可问题
,那么最优先的方法是取消对实际jar的限制,并使用其中的类文件将其重新jar到一个新的jar


您只需使用jarcmd本身即可,这没什么大不了的

我意识到这并不能完全满足您的需求,但我将介绍分发独立应用程序的常用方法。如果它确实满足了您的需求,您会发现它更好地得到工具的支持,更容易被用户理解,因为它遵循既定的惯例

将您的代码放入一个jar(我称之为
app.jar
)以及一个
META-INF/MANIFEST.MF
文件,其中包含如下条目:

Main-Class: com.y.app.AppMain
Class-path: third-party.jar blort.jar foo.jar
java -jar app.jar
然后,您可以将所有JAR放入一个目录中,并按如下方式运行
AppMain

Main-Class: com.y.app.AppMain
Class-path: third-party.jar blort.jar foo.jar
java -jar app.jar

如果你愿意,您可以将第三方库放在一个目录中,如
lib
,并在
类路径
属性中引用它们,使用相对于主jar的路径:
lib/third-party.jar
,这有助于保持分发的整洁。

如果不担心将第三方jar重新打包到最终的大jar中,然后应该是最简单的方法。

我对你的离题问题的一般回答是一篇(相当长的)文章:。它有很多指向免费和商业工具的链接,但我从未见过具有这种功能的Netbeans插件,对不起。

我首先要声明:Java可执行JAR不能这样工作。可执行JAR在JAR的MANIFEST.MF文件中定义了一个主类,清单还允许类路径的定义包含可执行JAR中的代码所需的库。清单中的类路径定义必须枚举要放在类路径上的每个JAR或文件夹,相对路径是相对于可执行JAR的位置的,而不是相对于可执行JAR中包含的路径。可执行jar是通过java可执行文件的“-jar”参数启动的,java“-cp”标志和CLASSPATH环境变量都被忽略。至于为什么可执行JAR是这样设计的,您应该知道从JAR中包含的JAR加载类的主要缺点,尽管本回复的其余部分将着重于这样做

注意:我丢失了完整解释它的原始sun论坛主题,但本质上是因为顶级JAR中的条目可以以随机访问的方式读取,但是必须先读取整个嵌入式JAR,然后才能访问任何条目,因为顶级JAR可能已经压缩了它的条目

我在过去已经成功地使用过,但是最终生成的jar的结构可能不是您所期望的。本质上,One-Jar类是最终Jar中唯一的非JARd类;所有其他代码(您的代码和任何依赖库代码)都作为JAR文件包含在结果中。您的应用程序在最后一个JAR的“main”文件夹中作为名为“main.JAR”的常规JAR文件进行JAR。代码所需的任何库都作为JAR文件放置在最终JAR的“lib”文件夹中。最后但并非最不重要的是,最后一个JAR的MANIFEST.MF文件告诉一个JAR您的主类是什么。执行是一个非常简单的“java-jarfinal.jar[您的应用程序使用的参数]”。关于你的离题问题,我不知道下一步如何转换成OS原生EXE,但无论如何,最好使用不同于一个Jar的打包机制。我不确定如何使用NetBeans实现这一点,我的建议是使用构建工具来打包最终的jar。幸运的是,一个Jar提供了关于使用Ant生成最终Jar的说明,这应该很容易集成到NetBeans中

我相信EclipseFatjar插件创建了一个单Jar可执行Jar,因此,如果该插件似乎做了您想要做的事情,那么单Jar就是实现它的方法。就我个人而言,我使用了Maven程序集


有一个警告-任何需要(或希望)利用Java的签名JAR验证的签名库可能不会以这种方式工作-像BouncyCastle这样的Java加密扩展(JCE)实现就是一个显著的例子。我认为原因是签名验证针对的是最终的JAR,而不是签名库。幸运的是,一个Jar允许最终用户向类路径添加额外的库,这在运行可执行Jar时是明确禁止的;为了解决这个问题,您最好使用最终的JAR和依赖于操作系统的启动脚本(.bat、.sh等)来交付有问题的JAR。

这是一个很好的指南,在不涉及所有这些第三方lib的情况下真正做到了我想要的


如果您使用MAVEN,请使用“MAVEN shade plugin”插件。它将编译包含所有依赖项(第三方等)的jar。

您的离题问题由。。。除了我不认为你能用netbeans做到这一点。这可能是一个重复的问题。我如何做到这一点?我知道我可以提取内容,但是我迷路了……我不同意。这对开发人员来说(也许)很简单,但对于需要用不同版本替换第三方库的用户来说却是一个障碍。Tha