代码之家  ›  专栏  ›  技术社区  ›  ZoFreX mxk

在Java程序中包含第三方JAR文件的最佳实践是什么?

  •  7
  • ZoFreX mxk  · 技术社区  · 16 年前

    我有一个需要几个第三方库的程序,目前它的打包方式如下:

    zerobot.jar (my file)
    libs/pircbot.jar
    libs/mysql-connector-java-5.1.10-bin.jar
    libs/c3p0-0.9.1.2.jar
    

    据我所知,处理第三方lib的“最佳”方法是将它们放在jar文件清单中的类路径上,这样可以跨平台工作,不会减慢启动速度(可能会捆绑它们),也不会遇到法律问题(可能会重新打包)。

    问题是对于自己提供第三方库的用户(例如用例,升级它们以修复bug)。其中两个库在文件中有版本号,这增加了麻烦。

    我目前的解决方案是,我的程序有一个引导过程,它生成一个新的类加载器,并正确地使用它来实例化程序。此自定义类加载器将lib/中的所有.jar文件添加到其类路径中。

    我目前的方法工作得很好,但现在我的应用程序中有两个自定义类加载器,最近对代码的更改导致了一些难以调试的问题,因此如果有更好的方法,我希望消除这种复杂性。我敢肯定这是一个非常普遍的情况,这也似乎是过度工程化。

    所以我的问题是,我该怎么做?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Arnold Spence    14 年前

    我们为jar提供脚本文件。例如一些蝙蝠,一些sh等。

    从java6开始,可以使用通配符指定类路径。

    这里有一篇很好的文章解释了这种方法: https://blogs.oracle.com/mr/entry/class_path_wildcards_in_mustang

        2
  •  1
  •   Brian Slesinsky    16 年前

    如果你的读者是技术性的(听起来他们愿意加入新的jar文件),那么也许你可以提供他们可以编辑的.sh和.bat文件来修改类路径?这对他们来说比定制的类加载器更透明。

        3
  •  0
  •   sysoutnull    16 年前

    你可以试试胖罐子的解决方案,它和 Fat Jar Eclipse Plug-In '.我曾经做过一些毫无问题的项目。它的原理似乎与你目前的解决方案相同。

        4
  •  0
  •   ZoFreX mxk    16 年前

    我想我要走舱单路线。在清单中为条目jar声明类路径,并具有以下条目:

    libs/pircbot.jar
    libs/mysql-connector-java-5-bin.jar
    libs/c3p0.jar
    

    然后,如果用户想要升级到最新的库版本,他们将不得不重命名它们以匹配清单中声明的内容。我不认为这是一个太大的麻烦,它使内部的事情简单得多。

    我也不喜欢把所有东西都自动加载到./lib/中,这似乎有潜在的危险。