我有一个需要多个第三方库的程序,目前它的打包方式如下:
zerobot.jar (my file) libs/pircbot.jar libs/mysql-connector-java-5.1.10-bin.jar libs/c3p0-0.9.1.2.jar
据我所知,处理第三方库的“最佳”方法是将它们放在我的jar文件清单中的类路径中,这将跨平台工作,不会减慢启动速度(捆绑他们可能)并且不会遇到法律问题(重新包装可能)。
问题在于自己提供第三方库的用户(示例用例,升级它们以修复错误)。其中两个库在文件中有版本号,这会增加麻烦。
我目前的解决方案是我的程序有一个引导过程,它创建一个新的类加载器并使用它实例化程序。这个自定义类加载器将lib /中的所有.jar文件添加到其类路径中。
我目前的方式运行正常,但我现在在我的应用程序中有两个自定义类加载器,最近对代码的更改导致了难以调试的问题,所以如果有更好的方法我想要消除这种复杂性。对于我确信这是一种非常常见的情况,它似乎也过度工程化了。
所以我的问题是,我该怎么做?
答案 0 :(得分:5)
我们提供jar的脚本文件。例如。 some.bat,some.sh等。
从Java6开始,您可以使用通配符指定类路径。
这是一篇很好的文章,解释了这种方法:https://blogs.oracle.com/mr/entry/class_path_wildcards_in_mustang
答案 1 :(得分:1)
如果你的观众是技术人员(听起来他们愿意放入新的jar文件),那么也许你可以提供他们可以编辑的.sh和.bat文件来修改类路径?对于他们来说,这比自定义类加载器更透明。
答案 2 :(得分:0)
您可以尝试Fat-Jar解决方案,它与'Fat Jar Eclipse Plug-In'完美配合。我已经习惯了几个没有任何问题的项目。它的原理似乎与您当前的解决方案相同。
答案 3 :(得分:0)
我想我会走明显路线。在条目jar的清单中声明类路径,并具有以下条目:
libs/pircbot.jar libs/mysql-connector-java-5-bin.jar libs/c3p0.jar
然后,如果用户想要升级到最新的库版本,他们必须重命名它们以匹配清单中声明的内容。我不认为这太麻烦了,而且内部的事情变得更加简单。
我通常也不喜欢自动加载./lib/中的所有内容的想法,这似乎有潜在危险。