我在我的机器上安装了2个版本的java,1.7和1.8。 用于构建我的java项目我正在使用maven 3.5.0。
在某些情况下我必须使用java 1.7构建我的java项目,
所以我将%JAVA_HOME%
环境变量从"C:\Program Files\Java\jdk1.7.0_80"
更改为"C:\Program Files\Java\jdk1.8.0_131"
。
然后我想如果我可以这样做,那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,也许它适用于早期版本。
所以我不得不在Mavens“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
代码段
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%"=="" goto OkJHome
for %%i in (java.exe) do set "JAVACMD=%%~$PATH:i"
goto checkJCmd
现在这是一个挑战
如何告诉mvn.cmd
它是用java编写的,是用pom.xml编写的?
如何让mvn.cmd
在MANIFEST.MF文件中编写正确的构建jdk?
答案 0 :(得分:2)
以下解决方案,如何在MANIFEST.MF文件中修复错误的JDK版本。此修复程序永远不会让您错误地构建项目(如果您的配置将更正)。
首先,必须从环境路径中删除Java链接C:\Program Files\Java\jdk1.7.0_80\bin
或%java_home%\bin
。
然后你必须在maven settings.xml文件中添加新的个人资料
<强>的settings.xml 强>
<profile>
<id>buildByJava7</id>
<activation>
<property>
<name>java</name>
<value>7</value>
</property>
</activation>
<properties>
<java-version>1.7</java-version>
<java-1.7>C:\Program Files\Java\jdk1.7.0_80\bin\javac</java-1.7>
<jdk>1.7.0_80</jdk>
<wsimport>C:\Program Files\Java\jdk1.7.0_80\bin\wsimport.exe</wsimport>
</properties>
</profile>
<profile>
<id>buildByJava8</id>
<activation>
<property>
<name>java</name>
<value>8</value>
</property>
</activation>
<properties>
<java-version>1.8</java-version>
<java-1.8>C:\Program Files\Java\jdk1.8.0_131\bin\javac</java-1.8>
<jdk>1.8.0_131</jdk>
<wsimport>C:\Program Files\Java\jdk1.8.0_131\bin\wsimport.exe</wsimport>
</properties>
</profile>
如您所见,有全局属性<java-version>, <java-1.8>, <jdk>, <wsimport>
。您可以使用mvn -Djava=7
或mvn -Djava=8
命令
现在你必须以这种方式改变Pom.xml
<强>的pom.xml 强>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<source>${java-version}</source> <!-- java compile version -->
<target>${java-version}</target> <!-- java compile version -->
<executable>${java-1.8}</executable> <!-- ..\bin\javac.exe file path -->
</configuration>
</plugin>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Build-Jdk>${jdk}</Build-Jdk> <!-- jdk version to set in manifest.mf file -->
</manifestEntries>
</archive>
</configuration>
</plugin>
...
如果您使用wsimport从* wsdl生成类,则必须使用wsimport.exe文件路径添加可执行文件。
请预见,如果您在%PATH%
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>${basedir}/src/main/resources/wsdl/app</wsdlDirectory>
<packageName>ge.jibo.app.client</packageName>
<sourceDestDir>${basedir}/target/generated-sources</sourceDestDir>
<keep>true</keep>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/wsdl/app/binding.xml</bindingFile>
<bindingFile>${basedir}/src/main/resources/wsdl/app/jaxb-binding.xml</bindingFile>
</bindingFiles>
<verbose>true</verbose>
<executable>${wsimport}</executable> <!-- ...\bin\wsimport.exe file path -->
</configuration>
</execution>
</executions>
</plugin>
完成此修改后,您只需运行命令mvn -Djava=8 clean package
此命令将激活buildByJava8
个人资料。
pom.xml将从配置文件中获取所有java版本和java / wsimport路径,所有内容都将被编译并成功构建并正确构建。
答案 1 :(得分:1)
我刚刚尝试使用maven-archiver插件强制自定义MANIFEST.MF并以某种方式确定“Build-Jdk”条目。但似乎总是覆盖java版本。如果您想尝试一下,请查看https://maven.apache.org/shared/maven-archiver/examples/manifestFile.html
我认为改变maven.cmd
不会让这个脚本意识到项目的特殊性。
如果要避免在某些构建之前手动更改JAVA_HOME,可能只需要为maven创建一个包装器批处理文件 引用你的jdk1.7:
SET "JAVA_HOME=C:\Program Files\Java\jdk1.7.0_80"
mvn.cmd %*
将此批处理文件保存为mvn_j7.bat
文件夹中的[MAVEN_HOME]\bin
。然后您可以在任何地方运行它,就像下面的示例中一样:
mvn_j7 clean package