防止maven-shade-plugin暴露<system>依赖?

时间:2018-02-14 20:34:08

标签: maven maven-shade-plugin

感谢单独的thread,我意识到我的项目的超级jar有一个bug。我使用maven-shade-plugin创建了超级jar,因为我需要更高级的转换器功能来合并多个ServiceLoader定义。

因此,问题是我的项目在tools.jar上具有系统范围的编译时依赖性,在本地机器上相对于tools.jar sysprop的值定位java.home。错误是我没有意识到这种依赖性是:

  1. 泄漏到uber-jar的依赖性减少pom.xml
  2. 更糟糕的是,依赖关系定义中的模式${java.home}正在被解析并硬编码到超级jar的POM中。第二部分特别令人尴尬,因为它揭示了构建机器的JDK位置(见第50行here)。
  3. 要解决此问题,我有条件地禁用了创建依赖项的配置文件。以下所有详细信息均位于<activation>部分:

    在:

    <profile>
      <id>internal.tools-jar</id>
      <activation>
        <file>
          <exists>${java.home}/../lib/tools.jar</exists>
        </file>
      </activation>
      <dependencies>
        <dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>1.8.0</version>
          <scope>system</scope>
          <systemPath>${java.home}/../lib/tools.jar</systemPath>
        </dependency>
      </dependencies>
    </profile>
    

    后:

    <profile>
      <id>internal.tools-jar</id>
      <activation>
        <jdk>1.8</jdk>
        <file>
          <missing>src/main/java/systems/manifold/Dummy.java</missing> <!-- this file is only present in the uber-jar module, therefore exclude if present -->
        </file>
      </activation>
      <dependencies>
        <dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>1.8.0</version>
          <scope>system</scope>
          <systemPath>${java.home}/../lib/tools.jar</systemPath>
        </dependency>
      </dependencies>
    </profile>
    

    所以,毕竟,我的问题是:这是防止这个系统范围的依赖关系泄漏到uber-jar的依赖关系减少pom.xml的最好方法吗?

    提前致谢,

    凯尔

    更新2018-02-16:

    不幸的是,shade插件中的以下配置不会阻止系统范围依赖性泄漏:

    <artifactSet>
      <excludes>
        <exclude>*</exclude>
      </excludes>
    </artifactSet>
    

    到shade插件的配置,但解析的系统范围依赖性仍然显示在POM中。令人费解!

0 个答案:

没有答案