【问题标题】:excluding .class file from jar maven dependency从 jar maven 依赖项中排除 .class 文件
【发布时间】:2015-09-23 07:24:24
【问题描述】:

我有 3 个 maven 项目 A、B、C。 A依赖于B,而B又依赖于C。 A 的 POM 对 B 有依赖关系,B 的 POM 对 C 有依赖关系。 我想在构建 A 时排除 C 中的类文件。

我该怎么做? 我尝试使用排除的 maven-jar-plugin 来执行此操作,但无法成功。

【问题讨论】:

  • 为什么要排除已编译的文件?
  • 转到 C 的本地 maven repo 您可以解压缩 C 并删除 .class 文件,然后再次制作 jar 并将其放在同一目录中,使用 java -jar 选项

标签: java maven


【解决方案1】:

使用maven-jar-plugin

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase>package</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        <configuration>
          <excludes>
            <exclude><!-- package you want to exclude --></exclude>
          </excludes>
        </configuration>
      </execution>
    </executions>
</plugin>

【讨论】:

  • 我想排除类而不是包
  • 标签中,您可以输入要排除的特定类。示例:com/package/Class.class
  • 我做了以下 maven-jar-plugin2.3.1default-jar id> packagejar**/net/proj/tp/schema/CardType/v1/myClass .class 但这不起作用,我可以在我的 maven 依赖项中看到这个类文件
【解决方案2】:

没有快速简便的方法可以做到这一点。如果您将 JAR 作为依赖项添加到项目中,则 JAR 将被添加到测试或编译类路径(基于您提供的范围)。

maven-dependency-plugin 提供了一个unpack 目标,可用于将工件解压缩到特定目录。

作为解决您的问题的方法,您可以在构建期间将工件 C 解压缩到 A 的目标/类中。 unpack 目标提供了一种排除某些文件模式的方法(因此您可以排除特定的类)。

还要确保 C JAR 未添加到 A 的类路径中(相应地调整您的依赖项 - 可能为 C 类型添加 pom 而不是 jar 的依赖项)。

https://maven.apache.org/plugins/maven-dependency-plugin/unpack-mojo.html

如何在不改变 B 的情况下从 A 中排除 C jar

    <dependency>
        <artifactId>B</artifactId>
        <groupId>bgroupId</groupId>
        <version>bverison</version>
        <exclusions>
            <exclusion>
                <artifactId>C</artifactId>
                <groupId>cgroupId</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
      <artifactId>C</artifactId>
        <groupId>cgroupId</groupId>
        <version>cverison</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <artifactId>*</artifactId>
                <groupId>*</groupId>
            </exclusion>
        </exclusions>
    </dependency>

现在您可以使用依赖插件适当地解压C JAR(不包括某些文件)

【讨论】:

  • 还要确保没有将 C JAR 添加到 A 的类路径中(相应地调整您的依赖项 - 可能为 C 类型的 pom 而不是 jar 添加依赖项)。 --我不能这样做,因为C不直接依赖于A,所以它的依赖在A的POM中没有提到,而是在B的POM中。如果我对这个B的POM进行更改,那么这将影响其他项目依赖于 C
  • @SpandanaVaddi - 您不必更改 B 的 POM,您可以通过更改 A 的 pom 文件来进行排序(用一些提示更新了答案)。但正如我在原始答案中提到的那样,没有干净的方法可以做你想做的事情。您尝试从类路径中排除某些类是否有任何具体原因?
  • @SpandanaVaddi - 还想知道为什么不能只更新 C 的 pom 文件,以便不将特定类打包到 C.jar 中?
  • 我们在两个不同的项目中有相同的类和相同的类路径。所以,我们要排除我们不需要的类之一
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 2015-03-07
  • 1970-01-01
  • 2016-02-28
  • 2019-09-25
  • 2015-09-29
  • 2013-05-04
  • 2020-04-19
相关资源
最近更新 更多