【问题标题】:Excluding certain .jars from a Maven dependency from build by classifier从分类器构建中排除 Maven 依赖项中的某些 .jar
【发布时间】:2021-03-31 07:15:20
【问题描述】:

我的项目包含 nd4j-native-platform 依赖项,其中包括适用于 windows、linux 和 mac 的 .jar。该应用程序是在 windows/mac 机器上开发的,然后部署到 Linux,所以我想通过排除这些在构建 .war 时占用 > 400 MB 的其他平台 jar 来节省部署空间。 Tl;博士,我想排除所有不以 linux-x86_64 结尾的 .jar。

pom 中的依赖:

<dependency>
    <groupId>org.nd4j</groupId>
    <artifactId>nd4j-native-platform</artifactId>
    <version>1.0.0-beta7</version>
    <classifier>linux-x86_64</classifier>
</dependency>

我没有看到任何方法可以通过依赖标记中的分类器排除它们,看来您只能通过 groupId 和 artifactId 排除它们。我还尝试在 .war 插件中使用 PackagingExcludes 和 warSourceExcludes,但这并没有做任何事情:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.3</version>
    <configuration>
        <packagingExcludes>
            WEB-INF/lib/nd4j-native-1.0.0-beta7-windows-x86_64.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-android-x86.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-macosx-x86_64.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-android-x86_64.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-linux-ppc64le.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-android-arm64.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-android-arm.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-windows-x86_64.jar,
            WEB-INF/lib/nd4j-native-1.0.0-beta7-linux-armhf.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-windows-x86.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-windows-x86.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-linux-armhf.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-linux-ppc64le.jar,
            WEB-INF/lib/openblas-0.3.9-1-1.5.3-linux-arm64.jar
        </packagingExcludes>
    </configuration>
</plugin>

使用 Maven 3.6.3。

【问题讨论】:

  • “包含”是指传递依赖,还是说jar实际上包含其他jar?
  • @JFabianMeier 它们是可传递的

标签: java maven jar war nd4j


【解决方案1】:

对于大多数使用 JavaCPP 的东西来说,处理这个问题的正确方法是设置 javacpp.platform 属性。

使用mvn -Djavacpp.platform=linux-x86_64 构建时,您将只获得该特定平台,而没有其他任何东西。这也适用于所有其他传递依赖,例如opencv。

您可以尝试运行mvn -Djavacpp.platform=linux-x86_64 dependency:tree 看看它是否有效。

【讨论】:

  • 不幸的是,这不起作用。当我使用 linux-x86_64 分类器添加 nd4j-native 依赖项时,nd4j 试图“提供帮助”并且仍然只提取 Windows 版本,因为我是在 Windows 上构建的。 nd4j-native-platform 包含所有不同平台的 .jar,因此我必须改用该依赖项,但我不知道如何告诉它排除其所有传递依赖项(即 nd4j-native .jars ; 是的,令人困惑,我知道)除了 linux 版本。
  • 您的评论提醒我,实际上有一种正确的方法可以使用提供平台工件的库内置于 DL4J 和其他 javacpp 中。我已经相应地更新了我的答案。
  • 很好,可以,谢谢!如何将该参数添加到 pom 中?我认为 -D 参数映射到 ,但是当我在那里添加 linux-x86_64 时,依赖关系树会回到所有 Windows 版本。
  • -D 选项的工作方式是它适用于所有级别和所有依赖项,而属性标签仅适用于当前 pom 文件及其子文件(声明它为他们的父母)。所以不幸的是,您无法在 pom.xml 文件中轻松设置它。但请查看github.com/bytedeco/javacpp-presets/wiki/… 了解更多选项
  • 为了支持 POM 属性,我们需要创建一个 Maven 扩展,本质上是一个自定义版本的 Maven:github.com/bytedeco/javacpp-presets/issues/846 我们可以使用 Gradle JavaCPP 更轻松地完成这种事情:github.com/bytedeco/gradle-javacpp#the-platform-plugin
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2013-03-09
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多