【问题标题】:How to exclude certain dependencies from being added to the Class-Path in maven?如何排除某些依赖项被添加到 Maven 中的 Class-Path?
【发布时间】:2020-09-22 05:02:26
【问题描述】:

我正在使用maven 构建一个可执行文件JAR,并且我想将所有依赖项添加到我的MANIFEST.MFClass-Path 中减去少数几个。到目前为止,我为此使用maven-jar-plugin

<!-- Add dependent JARs to the classpath -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libraries</classpathPrefix>
                <mainClass>MyMainClass</mainClass>
            </manifest>
            <manifestEntries>
                <Built-By>Me</Built-By>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

这适用于添加所有依赖项。但是,我还想排除某些依赖项被添加到Class-Path。根据the documentation,您可以使用exclude标签如下:

<configuration>
    <!-- ... -->
    <excludes>
        <exclude>**selenium*</exclude>
    </excludes>
    <!-- ... -->
</configuration>

我希望这会排除任何名称中包含 selenium 但它不起作用的依赖项。例如,我想从Class-Path 中排除libraries/selenium-json-4.0.0-alpha-6.jar。即使我指定了确切的名称,它也不会排除任何东西。我还想提供groupId 用于排除类似于maven-dependency-pluginexcludeGroupIds 标签的工作方式。

如何使用maven 完成所需的Class-Path 管理?

我还使用maven-shade-plugin 来构建可执行文件(胖)JAR,但它的清单操作工具似乎鲜为人知/记录在案。使用maven-shade-plugin 通过this 答案设置Class-Path 有效,但是如何使用排除项填充我的依赖项而不是对所有内容进行硬编码?

【问题讨论】:

  • 您已经找到解决方案了吗?如果有,请更新。

标签: java maven jar executable-jar


【解决方案1】:

TL;DR

Maven JAR 插件的includesexcludes 参数适用于文件,而不适用于依赖项

加长版

Selenium 通常用作测试依赖项。 Selenium 是否被声明为 Maven 依赖项?如果它只用于测试,我希望它有&lt;scope&gt;test&lt;/scope&gt;。在这种情况下,它不会出现在 JAR 清单中。

如果您不使用 Selenium 作为测试依赖项并且仍然不希望它最终出现在清单中,您可以考虑添加 &lt;scope&gt;provided&lt;/scope&gt;。提供的依赖项也不会出现在 JAR 清单中。这也意味着在运行时,一旦您调用 Selenium API,它可能会崩溃......

【讨论】:

  • 实际上,很抱歉撤消已接受的答案,但我意识到使用 provided 范围还会将依赖项的类等排除在 JAR 中,而不仅仅是 Class-Path 条目。我想包含类等,但不生成Class-Path 条目,因为代码已经存在于JAR 中,并且不需要通过Class-Path 从外部引用。你看,我希望将一些依赖项合并到JAR 和通过Class-Path 引用的其他外部依赖项。
  • 所以,如果我理解正确的话,您是在将所有依赖项隐藏到一个 JAR 文件中吗?我想在这种情况下,您不需要为 Maven JAR 插件配置 set addClasspathclasspathPrefix,因为 JAR 将包含所需的所有依赖项。
  • 没有。我将一些依赖项添加到JAR 中,并将大多数其他依赖项复制到libraries 文件夹中,以便主JAR 可以从Class-Path 引用它们。后一部分应该排除我已经在 JAR 中添加的依赖项。
  • 好的,我明白你想要什么,虽然我不明白为什么。但这并不重要。不幸的是,我不知道如何实现你想要的。不过据我所知,这有点不常见。
  • 我这样做是为了混淆和方便。我希望将我的本地 maven 库隐藏到 JAR 中,这样我就可以混淆主 JAR 并保持库 JARs 不受影响,因为它们无论如何都是开源的。这样我可以减小主 JAR 的大小,并且当同时应用于每个依赖项和我的代码时,混淆会花费更长的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2012-02-25
  • 2021-03-31
  • 2015-06-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多