当前位置: 首页 > 知识库问答 >
问题:

如何修改mvn.cmd以在MANIFEST.MF文件中获得正确的jdk构建版本

祁宝
2023-03-14

我在我的机器上安装了2个版本的java,1.7和1.8。为了构建我的java项目,我使用maven 3.5.0。

在某些情况下,我必须使用java 1.7构建我的java项目,因此我将我的< code>%JAVA_HOME%环境变量从< code >“C:\ Program Files \ JAVA \ JDK 1 . 7 . 0 _ 80”更改为< code >“C:\ Program Files \ JAVA \ JDK 1 . 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>

如您所见,这里有< code >

因此,我不得不在Mavens的“设置.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安装进行构建,然后它起作用了!!!如果我将可执行文件更改为${JAVA_1_8_HOME},则生成的jar文件更改的大小。

但是有一个大问题MANIFEST.MF.JDK的构建版本是1.8。0_161,所以MANIFEST.MF会撒谎,谁想找到构建jdk版本。

这样做的原因是Maven(mvn.cmd文件)查找%JAVA_HOME%并采用java的路径。如果环境中没有%JAVA_HOME%变量,它采用默认的系统java版本,在我的例子中是1.8。0_161(JRE版本)。

下面是< code>mvn.cmd代码片段

@REM ==== START VALIDATION ====
if not "%JAVA_HOME%"=="" goto OkJHome
for %%i in (java.exe) do set "JAVACMD=%%~$PATH:i"
goto checkJCmd

这是一个挑战

如何告诉<code>mvn。cmd它是由用pom.xml编写的java 7构建的?

如何让< code>mvn.cmd在MANIFEST中编写正确的build jdk。MF文件?

共有2个答案

水铭晨
2023-03-14

以下是解决方案,如何修复清单中不正确的JDK版本。MF文件。此修复程序将永远不会让您错误地构建项目(如果您的配置正确)。

首先需要从环境PATH中删除Java链接C:\Program Files\Java\jdk1.7.0_80\bin%java_home%\bin

然后,您必须在maven设置中添加新的配置文件。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>

如您所见,有全局属性

现在你必须以这种方式改变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%中有java链接,这将不起作用

<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>

修改后,您可以运行命令< code > mvn-DJ ava = 8 clean package

此命令将激活buildByJava8profile。pom。xml将从概要文件中获取所有java版本和java/wsimport路径,所有内容都将被编译并正确构建。

鲜于玮
2023-03-14

我刚刚尝试使用maven-archiver插件来强制自定义清单。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中folder.Then您可以在任何地方运行它,就像下面的示例中一样:

mvn_j7 clean package
 类似资料:
  • 问题内容: java.library.path属性似乎是只读的。例如,当您在以下构建文件上运行ant时 你得到 输出表明 java.library.path 尚未更改,但是 some.other.property 设置正确。 我想知道如何在构建文件中修改java.library.path。实际上,在ant命令行上指定java.library.path并不是一个简单的选择,因为那时还不知道库路径位置

  • 我想在请求正文到达Http Servlet并获得processed.The请求正文的JSON有效负载如下所示,我想摆脱“PayamtChqmanViewObject”(详细信息)部分。 我可以使用以下方法获得请求正文,但我不知道如何删除JSON的详细部分并将处理后的请求正文传递给HTTP Servlet。 非常感谢您的帮助!

  • 本文向大家介绍MySql8.0以上版本正确修改ROOT密码的方法,包括了MySql8.0以上版本正确修改ROOT密码的方法的使用技巧和注意事项,需要的朋友参考一下 部署环境: 安装版本red hat Cent 7.0 MYSQL 版本 8.0.2.0 成功部署完毕后出现故障情况: 1.      正常启动MYSQL服务后,敲Linux中root账户和密码进入不去。 2.      从/etc/my

  • 如果我们看到。类文件结构,它说:偏移量0x04-0x05用于JDK的次要版本,偏移量0x06-0x07用于JDK的主要版本 我使用eclipse和JDK1进行java项目开发。为JRE系统库和类文件配置的5.0_7/JRE将偏移显示为0x00 0x00 0x00 0x31。 如何将编译器更改为JDK1。5.0_7以使偏移量变为0x00 0x07 0x00 0x31?

  • 我的gradle项目(“osgiapp”)依赖于一个OSGI项目(“osgidep”),该项目具有以下MANIFEST.MF条目: 这里导出了两个包: test.lib包由osgidep.jar中包含的lib/lib.jar提供 test.osgidep包由osgidep.jar本身提供 现在,我的建筑。Gradle看起来是这样的: 当我试图构建使用两个导出包的代码时:

  • 尝试编译和链接JNI progam 然后我继续转到R,并将rJava包作为源代码安装,如下所示:,然后转到 然后,当我使用以下命令检查版本时: