如何管理项目的依赖项(库)的许可证?

时间:2011-07-10 09:02:49

标签: maven licensing repository nexus artifactory

我想知道Nexus repository manager是否包含像Artifactory这样的许可证管理器(使用此插件:http://wiki.jfrog.org/confluence/display/RTF/License+Control)。

如果通过插件无法在Nexus中执行此操作,您如何管理项目依赖项的许可证(使用maven)?

e.g。对于商业项目,我不能将GPL库包含在最终工件(.jar,.war等)中。

3 个答案:

答案 0 :(得分:7)

可以使用Maven许可证验证程序插件

模拟Artifactory功能

http://code.google.com/p/maven-license-validator-plugin/

这两种方法的实际问题是,很少有Maven Central模块在其POM中具有最新的许可证信息。因此,从我所看到的,这是一个很好的想法,不能真正解决评估构建的许可证合规性的问题......

我理想的解决方案是一组外部流程,用于扫描Nexus存储库的内容以获取可用的许可证信息。然后,此信息用于为Nexus Professional的procurement suite提供种子,以控制已批准的存储库的内容以供在发布(非开发版本)中使用。

某些二进制文件包含文本许可证文件,或者也可以扫描相关的源代码包以获取许可证和IP信息。许多第三方工具可用于执行此任务。我一直在考虑的是:

总之,在Maven Central可以提供关于模块许可的可靠元数据之前,我认为这个问题的解决方案将保持高度定制和次优

答案 1 :(得分:1)

Artifactory采用的方法略有不同,因为原始工件元数据仅用作起点,但在一天结束时,用户可以完成并修改丢失/错误的许可证信息:

  1. 首先,POM(包括所有父POM)或Ivy描述符用于提取启发式许可信息。此自动发现步骤纯粹是可选的。
  2. 然后,此许可证信息将根据其校验和附加到工件,并且可由用户完全编辑。管理员可以更新许可证详细信息,这些信息将在工作时间内与工件保持一致。
  3. 根据全球政策,每份许可都可以获得批准或不批准。
  4. 在部署时,将读取所有依赖项的许可证信息 - 如果找到未批准或未知的许可证,则会将包含该信息的电子邮件警报发送到预配置的地址。
  5. 这使您可以在构建过程提交并获取新依赖项(及其各自的许可证)后立即处理这些更改/添加。

    另一个关键区别是能够处理具有多个许可证的工件,其中只有一个许可证被批准而其他许可证不被批准。

    你可以在这里阅读更多相关信息 -

    http://wiki.jfrog.org/confluence/display/RTF/License+Control

答案 2 :(得分:0)

与Artifactory + Ivy + ant一起使用的自定义解决方案是扫描每个模块以获取许可证信息。如果找到许可证,请在Artifactory中填充该许可证文件并更新它ivy.xml以使其可用作已发布的工件。然后调用<ivy:retrieve/>以获取许可证及其jar文件。

许可证可以在模块的ivy.xml中指定为URL。在这种情况下,使用ant的{​​{1}}任务下载许可证并将其写入文本文件。

get

或者,许可证可以作为文本文件包含在模块的[inside log4j's ivy.xml as an example] <ivy-module xmlns:m="http://ant.apache.org/ivy/maven" version="2.0"> <info organisation="log4j" module="log4j" revision="1.2.16" status="integration" publication="20120620150430"> <license name="The Apache Software License, Version 2.0" url="http://www.apache.org/licenses/LICENSE-2.0.txt"/> ... </info> </ivy-module> 文件中。在这种情况下,使用.jar的{​​{1}}任务提取许可证并将其写入文本文件。

ant

将许可证写为文本文件后,使用unjar的{​​{3}}任务将许可证添加为工件。

[inside junit's .jar file as an example]
 junit-4.8.2.jar/LICENSE.txt

将修改后的ant和许可证发布回Artifactory。

[inside log4j's ivy.xml as an example]
<publications>
 <artifact conf="master" ext="jar" name="log4j" type="bundle"/>
 <artifact conf="sources" ext="jar" m:classifier="sources" name="log4j" type="source"/>
 <artifact conf="javadoc" ext="jar" m:classifier="javadoc" name="log4j" type="javadoc"/>
 <!-- next line added -->
 <artifact conf="master" ext="txt" name="log4j" type="license"/> 
</publications>

在与您的构建捆绑时,使用ivy.xml获取许可证及其jar文件。

<ivy:resolve file="${ivy.xml}" />
<ivy:publish resolver="${resolver}" pubrevision="@{rev}" status="integration"
 overwrite="true" forcedeliver="true" haltonmissing="false"
 srcivypattern="${ivy.local}/[organisation]/[module]/ivy-[revision].xml" >
  <artifacts pattern="${ivy.local}/[organisation]/[module]/ivys/ivy-[revision].[ext]" />
  <artifacts pattern="${ivy.cache.dir}/[organisation]/[module]/licenses/[module]-[revision].[ext]" />
</ivy:publish>