lev*_*tov 8 java conditional-compilation maven java-8
我有一个Java项目库.我想实现,测试,并可能发布该项目的几个版本,意图与不同的Java版本一起使用:6,7,8.
最简单的方法就是复制粘贴项目并支持多个源树,但我想避免这种情况,因为它很乏味且容易出错.
另一种可能的方法是考虑"基础"项目和几个特定于Java版本的项目.版本略有不同,但我没有在类层次结构中反映这个技术开发问题的内容.
所以我在找
这可以帮助从单个源树支持几个Java版本特定的库版本,并且对lib用户透明.
您可以从单个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.
一种方法是嵌入代码中:来自 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 版本设置变量来更改代码。尽管会在尽可能少的地方执行此操作,因为这将很难调试。或者至少在运行动态代码之前打印日志,以便您知道哪个版本/实际行有问题。