【发布时间】:2018-07-12 17:55:29
【问题描述】:
我在我的机器上安装了 2 个版本的 java,1.7 和 1.8。 为了构建我的 java 项目,我使用的是 maven 3.5.0。
在某些情况下,我必须使用 java 1.7 构建我的 java 项目,
所以我将我的%JAVA_HOME% 环境变量从"C:\Program Files\Java\jdk1.8.0_131" 更改为"C:\Program Files\Java\jdk1.7.0_80"。
然后我想如果我能做到,那 pom.xml 决定了 java 的版本,应该用它来构建项目。
一开始我的 pom.xml 是这样的
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
...
</plugins>
如您所见,有 <source> 和 <target> 标签,但此标签不适用于 java 1.7、1.8,也许它适用于早期版本。
所以我不得不在 Maven 的“settings.xml”和“pom.xml”文件中进行一些更改:
settings.xml
<profiles>
<profile>
<id>compiler</id>
<properties>
<JAVA_1_7_HOME>C:\Program Files\Java\jdk1.7.0_80\bin\javac</JAVA_1_7_HOME>
<JAVA_1_8_HOME>C:\Program Files\Java\jdk1.8.0_131\bin\javac</JAVA_1_8_HOME>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>compiler</activeProfile>
</activeProfiles>
pom.xml
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<executable>${JAVA_1_7_HOME}</executable>
<verbose>true</verbose>
<fork>true</fork>
</configuration>
</plugin>
...
</plugins>
然后使用mvn install 进行构建,它成功了!!!如果我将可执行文件更改为 ${JAVA_1_8_HOME} 生成的 jar 文件的大小会发生变化。
但是 MANIFEST.MF 中有一个大问题。 JDK的构建版本是1.8.0_161,所以MANIFEST.MF会骗人,想知道构建jdk的版本。
这是因为 Maven(mvn.cmd 文件)查找 %JAVA_HOME% 并采用 java 的路径。如果环境中没有 %JAVA_HOME% 变量,则采用默认系统 java -version,在我的情况下为 1.8.0_161(JRE 版本)。
这里是mvn.cmd 代码 sn-p
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%"=="" goto OkJHome
for %%i in (java.exe) do set "JAVACMD=%%~$PATH:i"
goto checkJCmd
现在是一个挑战
如何告诉mvn.cmd它是用pom.xml编写的java 7构建的?
如何让mvn.cmd在MANIFEST.MF文件中写入正确的构建jdk?
【问题讨论】: