我一直在将第 3 方库 JAR 提取到我的开源 Java 库中,以便依赖项在运行时工作。
我记得当我不久前在 Eclipse 中尝试这样做(不同的项目)时,它会在执行此操作之前产生一个检查许可的警告。
关于何时可以将库内容重新打包到 JAR 中、应该如何完成以及哪些广泛使用的许可证禁止这样做的一般规则到底是什么?
具体来说,我正在重新打包的库使用 BSD 和 LGPL。
在此先感谢您的帮助。
编辑
正如几位评论者所建议的那样,我实际上最终分离了依赖项以防止代码冲突。再次感谢您提供的建议和信息。
我个人所做的是确保我使用的任何库都没有明确禁止重新分发。如果他们这样做了,那你就不走运了。BSD 和 LGPL 都没有,所以你应该没问题。我想不出一个理智的开源许可证。
一旦您对重新打包和分发许可条款感到满意,您就需要确保在其他方面尊重它们。我发现以下步骤足以满足 99.99% 的开源许可证:
license.txt在您的 JAR 文件的根目录下创建一个文件(有些人将其放入META-INF,但我不知道对此没有任何规则或约定,并认为这只是一个偏好问题)。license.txt.license.txt.这应该确保您不会违反任何主流许可证,但 GPL 除外。我不是律师,也不是 GPL 方面的专家,我给你的任何关于如何尊重 GPL 的建议最终都可能完全错误,所以我不想让你误入歧途。
您还可以做一些其他事情,但更多的是出于职业礼貌:
About部分中使用的库。虽然这听起来像是很多工作,但它比编写和维护实际的库要少得多。
编辑:我刚刚意识到您正在开发一个库,而不是一个应用程序。我的回答实际上并不适用于这种情况:将依赖项打包到库的 JAR 中是非常糟糕的形式。如果有的话,它会使第三方开发人员更难将您的库与现有的构建工具和依赖管理系统(maven、ant / ivy...)集成。
如果您想保持简单,只需将所有依赖项的 JAR 包含在/lib分发文件的文件夹中即可。
重申我的观点:我相信通过将依赖项打包在库的 JAR 文件中而不是与它一起,您会疏远大多数开发人员。如果问题没有得到解决,我当然会提交错误报告并寻找替代方案。
使用 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>