gpt4 book ai didi

java - 如何将库与我的 jar 结合起来?

转载 作者:搜寻专家 更新时间:2023-11-01 00:59:43 24 4
gpt4 key购买 nike

好的,所以我写了一个程序,它利用了第 3 方开源库,我想将它与我的程序打包在一个 jar 中。我正在使用 netbeans 6.8,我尝试过的所有 java 总是吐回错误:

java.lang.NoClassDefFoundError: libraryname;

题外话:如果可能的话,我还想知道如何通过 netbeans 制作可执行文件 jar(exe)。 (我见过用 java 编写的程序,但是是 .exe)

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

最佳答案

我将从强制性免责声明开始:Java 可执行 JAR 不能以这种方式工作。可执行 JAR 在 JAR 的 MANIFEST.MF 文件中定义了一个主类,并且 MANIFEST 还允许类路径的定义,以包含可执行 JAR 中的代码将需要的库。 MANIFEST 中的类路径定义必须枚举每个 JAR 或文件夹以放入类路径,相对路径是相对于可执行 JAR 的位置的 - 而不是相对于包含在可执行 JAR 内部的路径。可执行 JAR 使用 java 可执行文件的“-jar”参数启动,java“-cp”标志和 CLASSPATH 环境变量都被忽略。至于为什么可执行 JAR 以这种方式设计,您应该意识到从 JAR 中包含的 JAR 加载类的主要缺点,尽管本回复的其余部分将专注于这样做。

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

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

我相信 Eclipse FatJar 插件会创建一个 One-Jar 可执行 JAR,因此如果该插件似乎可以满足您的需求,那么 One-Jar 就是实现它的方式。就个人而言,我使用了 Maven 程序集。

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

关于java - 如何将库与我的 jar 结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2018257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com