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文件中创建额外的构建目标。 并使用zipfileset
和zipgroupfileset
创建一个大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
文件夹中)。
- 线程“main”中的exceptionjava.lang.UnsatisfiedLinkError:资源路径中找不到jnidispatch(/ com / sun /jna/win32-x86/jnidispatch.dll)
- Java Swing桌面应用程序中的自动更新function
- LocationAwareLogger上的SLF4J NoSuchMethodError
- Java-Process可以删除加载的JAR吗?
- 从与.jar文件位于同一文件夹的文件中读取
- JAR和包之间有什么区别?
- 如何确定应用程序中使用的JAR
- 如何检查Jar文件之间的依赖关系?
- 从基于Spring的Java应用程序创建单个可执行JAR