如何为不同的Java版本支持不同版本的主(和测试)源集(6,7,8)

lev*_*tov 8 java conditional-compilation maven java-8

我有一个Java项目库.我想实现,测试,并可能发布该项目的几个版本,意图与不同的Java版本一起使用:6,7,8.

最简单的方法就是复制粘贴项目并支持多个源树,但我想避免这种情况,因为它很乏味且容易出错.

另一种可能的方法是考虑"基础"项目和几个特定于Java版本的项目.版本略有不同,但我没有在类层次结构中反映这个技术开发问题的内容.

所以我在找

  • 一种预编译器
  • 和/或标准Maven选项
  • 和/或Maven插件

这可以帮助从单个源树支持几个Java版本特定的库版本,并且对lib用户透明.

333*_*hin 8

您可以从单个pom.xml文件为每个Java版本(6,7,8)生成一个jar.

所有相关工作都在maven-compiler-plugin中进行:编译 mojo.

诀窍是执行mojo 3次,每次将结果文件写入不同的outputFileName.这将导致编译器多次运行,每次使用不同的版本并吐出适当命名的文件.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
        <execution>
            <id>compile-1.6</id>
            <goals>
                <id>compile</id>
            </goals>
            <phase>compile</phase>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <executable>${env.JAVA_HOME_6}/bin/javac</executable>
                <outputFileName>mylib-1.6.jar</outputFileName>
            </configuration>
<!-- START EDIT -->
            <dependencies>
                <dependency>
                    <groupId>com.mycompany</groupId>
                    <artifactId>ABC</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
<!-- END EDIT -->
        </execution>
        <execution>
            <id>compile-1.7</id>
            <phase>compile</phase>
            <goals>
                <id>compile</id>
            </goals>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <executable>${env.JAVA_HOME_7}/bin/javac</executable>
                <outputFileName>mylib-1.7.jar</outputFileName>
            </configuration>
<!-- START EDIT -->
            <dependencies>
                <dependency>
                    <groupId>com.mycompany</groupId>
                    <artifactId>XYZ</artifactId>
                    <version>2.0</version>
                </dependency>
            </dependencies>
<!-- END EDIT -->
        </execution>

        <!-- one more execution for 1.8, elided to save space -->

    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

编辑

RE:每个运行针对不同源编译的附加要求.

请参阅上面对pom代码段的编辑.

每个执行都可以定义自己的依赖库列表.

因此JDK6构建依赖于ABC.jar,但JDK7依赖于XYZ.jar.


tgk*_*rog 3

一种方法是嵌入代码中:来自 log4j2 源代码:

   //  JDK 1.1 doesn't support readResolve necessary for the assertion 
   if (!System.getProperty("java.version").startsWith("1.1.")) {
        assertTrue(obj == Level.INFO);
    }
Run Code Online (Sandbox Code Playgroud)

您还可以使用https://github.com/raydac/java-comment-preprocessor并根据 java 版本设置变量来更改代码。尽管会在尽可能少的地方执行此操作,因为这将很难调试。或者至少在运行动态代码之前打印日志,以便您知道哪个版本/实际行有问题。