java - 如果 ~/.m2/toolchains.xml 不存在,则忽略使用工具链的 Maven 执行 block

标签 java maven maven-toolchains-plugin

我正在开发一个开源库,它必须在 jre7 上正常工作。由于 java 9 已经发布,我们决定为我们的模块提供 module-info.java 文件,以便用户可以在 jre9 上使用带有 sdk 9 的库时使用它们(在这种情况下,他们需要手动在pom.xml中放入这段代码:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
      <source>9</source>
      <target>9</target>
    </configuration>
  </plugin>

我尝试实现maven(https://maven.apache.org/plugins/maven-compiler-plugin/examples/module-info.html)提供的解决方案,用jdk7编译整个代码,并用jdk9仅编译module-info.java文件。这是一段 pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <executions>
      <execution>
        <id>default-compile</id>
        <configuration>
          <!-- compile everything to ensure module-info contains right entries -->
          <!-- required when JAVA_HOME is JDK 8 or below -->
          <jdkToolchain>
            <version>9</version>
          </jdkToolchain>
          <release>9</release>
        </configuration>
      </execution>
      <execution>
        <id>base-compile</id>
        <goals>
          <goal>compile</goal>
        </goals>
        <!-- recompile everything for target VM except the module-info.java -->
        <configuration>
          <excludes>
            <exclude>module-info.java</exclude>
          </excludes>
        </configuration>
      </execution>
    </executions>
    <!-- defaults for compile and testCompile -->
    <configuration>
      <!-- jdkToolchain required when JAVA_HOME is JDK 9 or above -->
      <jdkToolchain>
        <version>[1.7,9)</version>
      </jdkToolchain>
      <source>1.7</source>
      <target>1.7</target>
    </configuration>
  </plugin>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>1.1</version>
    <executions>
      <execution>
        <goals>
          <goal>toolchain</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <toolchains>
        <jdk>
          <version>9</version>
        </jdk>
      </toolchains>
    </configuration>
  </plugin>

我已经正确配置了 ~/.m2/toolchains.xml 文件。它工作得很好。但问题是我们需要跳过第一个执行 block ,其中所有内容都是使用 jdk9 和模块信息进行编译的,因为我们不想让用户创建 toolchains.xml 文件并设置 java 9。所以我可能正在寻找什么for 是一种解决方法,如果 ~/.m2 目录中不存在 toolchains.xml,则跳过以下代码,仅执行第二个执行 block ,其中 module-info.java 文件将被忽略。这可能吗?我意识到我们仍然可以保留两个分支(一个是私有(private)的,有两个执行 block 并使用工具链,另一个是公共(public)的,它完全忽略 module-info.java 文件,但这似乎不是一个优雅的解决方案。

<execution>
    <id>default-compile</id>
    <configuration>
      <!-- compile everything to ensure module-info contains right entries -->
      <!-- required when JAVA_HOME is JDK 8 or below -->
      <jdkToolchain>
        <version>9</version>
      </jdkToolchain>
      <release>9</release>
    </configuration>
  </execution>

最佳答案

  1. 您可以使用 Maven 配置文件激活/停用 pom 的某些部分。
  2. 提供库的两个不同版本不是更好吗?版本号为 1.0.0-JDK7 和 1.0.0-JDK9。然后,图书馆的使用者就可以根据自己的目的选择正确的图书馆。

关于java - 如果 ~/.m2/toolchains.xml 不存在,则忽略使用工具链的 Maven 执行 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705178/

相关文章:

android - Maven:在使用 retrolambda-maven-plugin 和 DEX-ed 使用 android-maven-plugin 的应用程序中使用 Java 8 库

java - 正确设置工具链后 Maven 构建错误

java - 倒计时什么时候开始将数据插入数组java

java - 结合 DispatcherServlet、ContextLoaderListener 和 SpringSecurity

eclipse - GWT设计器不适用于Maven-GWT项目

java - Tesseract For Java 为可执行 jar 设置 Tessdata_Prefix

java - Kotlin + Java 9 模块(使用 Java 11)+ maven

maven - 编译不同Java版本的Maven模块

java - InputStream 到 JsonObject - GSON

java - 使用 [^a-zA-Z] 正则表达式替换单词时出现问题