NetBeans – 在一个jar中部署所有

可能重复:
把外部库放到JAR上?

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

我怎么能在一个jar文件中得到所有这些? (我不使用Maven / Ant或类似的东西。)

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

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

如果你真的想要一个“jar-inside-jar”解决方案,我们已经使用了一个jar子几年,但是因为我们的目标JVM使用上述解决方案更好地工作了。

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

我在Eclipse中使用了fatjar插件。 我没有任何构建Netbeans的经验,但很容易构建成一个ant脚本,我相信这是NEtbeans所使用的。

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

        

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

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

                    To run this application from the command line without Ant, try:  java -jar "${dist.jar.resolved}"   

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

to

 . 

就这样。

您可以使用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文件夹中)。