重新打包Java库JAR文件

4
我一直在将第三方库JAR文件提取到我的开源Java库中,以使依赖项在运行时正常工作。
我记得以前在Eclipse中尝试过这样做(不同的项目),它会产生一个警告,要求在进行此操作之前检查许可证。
关于何时可以将库内容重新打包到您的JAR中,应该如何执行以及哪些广泛使用的许可证禁止这样做的一般规则是什么?
具体来说,我正在重新打包使用BSD和LGPL的库。
感谢您的帮助。
编辑
实际上,我最终分离了依赖项,以防止代码冲突,正如几位评论者建议的那样。再次感谢提供的建议和信息。

1
一个更好的解决方案是使用Maven来构建您的项目(或者使用像Ivy这样的依赖管理器的Ant,或者任何为您管理依赖项的工具)。 - parsifal
1
即使您不喜欢Maven的概念,我可以保证您的JAR可能的消费者会更不喜欢重复的依赖性。 - parsifal
但是如果你真的想这样做,我建议你在Google上搜索PSE。有很多关于“开源许可证jar依赖项site:stackexchange.com”的答案,其中大部分都是“我不是律师”的形式。 - parsifal
依赖管理是一个已解决的问题。你忽视了这个事实,让那些不是在构建玩具应用程序的人生活更加困难。但正如我上面所说,这是你的选择,也是你潜在用户群的选择,是否值得承受潜在的痛苦来换取潜在的好处。 - parsifal
4
我投票关闭此问题,因为它涉及许可证或法律问题,而不是编程或软件开发。有关详细信息,请参见这里这里,以及[帮助]。 - JasonMArcher
显示剩余7条评论
2个回答

6
我个人做的是确保我使用的库没有明确禁止重新分发。如果有,那就没戏了。不过BSD和LGPL都没有这样做,所以你应该没问题。我想不出任何明智的开源许可证会这样做。
一旦你确定通过重新打包和分发不违反许可证条款,你需要确保在其他方面尊重它们。我发现以下步骤对于99.99%的开源许可证足够:
- 在JAR文件的根目录下创建一个license.txt文件(有些人将其放在META-INF中,但我不知道是否有规则或约定,并认为这只是喜好问题)。 - 在license.txt中列出你导入的所有外部库及其分发的许可证。 - 在license.txt中编写适用的所有许可证的完整文本。 - 最好,如果有的话,链接到每个库的网站、下载页面和许可证页面。
这应该确保你不会违反任何主流许可证,除了GPL。我不是律师,也不是GPL专家,我给你关于如何尊重它的任何建议可能完全错误,所以我不想误导你。
还有一些事情可以做,但这更多是职业礼仪问题:
- 如果你正在编写用户界面应用程序(Web服务、UI应用程序等),在“关于”部分中链接到你正在使用的库。 - 让库的维护者知道你正在使用和打包它——一些作者喜欢维护一个使用他们工具的流行软件列表。
虽然这听起来像是很多工作,但它比编写和维护实际的库要少得多。
编辑:我刚才意识到你正在开发一个库,而不是应用程序。我的答案实际上并不适用于这种情况:在你的库的JAR中打包你的依赖项非常不专业。如果有什么问题,它会使第三方开发人员将你的库与现有的构建工具和依赖管理系统(maven、ant/ivy等)集成变得更加困难。
如果你想保持简单,只需在你的分发文件的/lib文件夹中包含所有依赖项的JAR即可。
再次强调我的观点:我认为通过将依赖项打包在库的JAR文件中而不是与其一起打包,你会疏远大多数开发人员。如果问题没有得到解决,我肯定会提交错误报告并寻找替代方案。

我明白了。所以你的建议是将所有依赖项放在一个JAR包中,并允许它们使用它? - bgroenks
好的,标准解决方案是将所有JAR依赖项复制到项目结构的/lib目录中 - 如果可能的话,请清晰地标记它们并在文件名中包含库的版本号。 - Nicolas Rinaudo
这就是我最终所做的。我还提供了一个重新打包的JAR文件,其中包含所有依赖项,方便那些不需要更改它们的人使用。 - bgroenks

0

这在maven中很容易实现。将项目转换为maven项目,这将使您的生活更加轻松,并使用maven-assembly-plugin和descriptorRefs作为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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接