用Java重新打包库JAR

时间:2013-03-21 20:50:23

标签: jar licensing packaging java

我一直在将第三方库JAR提取到我的开源Java库中,以便依赖项在运行时工作。

我记得当我在Eclipse中尝试这样做的时候(不同的项目)它在执行此操作之前产生了警告以检查许可。

关于什么时候可以将库内容重新打包到JAR中,如何进行以及哪些广泛使用的许可证禁止它的一般规则究竟是什么?

具体来说,我重新打包的库使用BSD和LGPL。

提前感谢您的帮助。

修改

我实际上最终分离出了依赖关系,以防止代码冲突,正如几位评论者建议的那样。再次感谢您提供的建议和信息。

2 个答案:

答案 0 :(得分:6)

我个人所做的是确保我使用的库都没有明确禁止重新分发。如果他们这样做,那你就不走运了。既不是BSD也不是LGPL,所以你应该没问题。我想不出一个理智的开源许可证。

一旦您对通过重新包装和分发许可证而违反许可条款感到满意,您需要确保在其他方面尊重许可条款。我发现以下步骤足以满足99.99%的开源许可证的需要:

  • 在您的JAR文件的根目录下创建一个license.txt文件(有些人将其放在META-INF中,但我知道没有任何规则或约定,并认为这只是一个偏好问题)。
  • 列出您导入的所有外部库以及在license.txt中分发它们的许可证。
  • 撰写适用于license.txt
  • 的所有许可的完整文本
  • 理想情况下,链接到每个图书馆的网站,下载页面和许可页面(如果有)。

除了GPL之外,这应该确保您不会违反任何主流许可证。我不是律师,我也不是GPL的专家,我给你的关于如何尊重它的任何建议可能最终都是完全错误的,所以我宁愿不要误导你。

你可以做更多的事情,但这些更多的是专业礼貌:

  • 如果您正在编写面向应用程序的用户(webservice,UI应用程序...),请链接到您在About部分中使用的库。
  • 让图书馆的维护者知道您正在使用和打包它 - 一些作者喜欢使用他们的工具维护一份流行软件列表。

虽然这听起来像是很多工作,但与编写和维护实际的库相比,它的工作要少得多。

编辑:我刚刚意识到您正在使用,而不是应用程序。在这种情况下,我的答案实际上并不适用:将您的依赖项打包到库的JAR中是非常糟糕的形式。如果有的话,它会让第三方开发人员更难将您的库与现有的构建工具和依赖管理系统(maven,ant / ivy ......)集成。

如果您想简单易懂,只需将所有依赖项的JAR包含在分发文件的/lib文件夹中。

重申我的观点:我相信你会通过打包你的库的JAR文件依赖而不是来疏远大多数开发人员。如果没有解决问题,我当然会提交错误报告并寻找备选方案。

答案 1 :(得分:0)

使用maven实现这一点非常容易。将项目转换为maven项目,这将使您的生活更轻松,并使用带有descriptorRefs的maven-assembly-plugin作为jar-with-dependencies(预定义的程序集结构)。如果你愿意,你可以创建自己的,所以maven打包你喜欢的代码。

maven-assembly-plugin配置示例:

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>