【问题标题】:Maven project dependency against JDK versionMaven 项目对 JDK 版本的依赖
【发布时间】:2011-02-03 18:03:50
【问题描述】:

我有需要使用特定版本的 JDK 构建的项目。

问题不在于源参数和目标参数,而在于编译期间使用的运行时 jar。 在某些情况下,如果我尝试使用错误的 JDK 进行编译,我会遇到编译错误,但有时构建会成功,并且在使用 jar 时会出现运行时错误。

例如在eclipse中我可以在.classpath文件中为项目建立执行环境。

有没有办法在maven中处理这种情况?

我想要的是能够像处理 POM 文件中项目的其他依赖项一样处理 JRE 依赖项。

更新:

当我问这个问题时,接受的解决方案是最好的,所以我不会改变它。同时引入了针对此类问题的新解决方案:Maven Toolchain。点击链接了解更多详情。

【问题讨论】:

    标签: maven-2 dependencies java


    【解决方案1】:

    我找到了这篇文章:

    http://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.html

    <project>
      [...]
      <build>
        [...]
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_4_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
          </plugin>
        </plugins>
        [...]
      </build>
      [...]
    </project>
    

    【讨论】:

      【解决方案2】:

      我有需要使用特定版本的 JDK 构建的项目。

      您可以使用Maven Enforcer plugin 来强制使用特定版本的JDK:

      <project>
        [...]
        <build>
         <plugins>
           <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-enforcer-plugin</artifactId>
              <executions>
                <execution>
                  <id>enforce-versions</id>
                  <goals>
                    <goal>enforce</goal>
                  </goals>
                  <configuration>
                    <rules>
                      <requireJavaVersion>
                        <version>1.5</version>
                      </requireJavaVersion>
                    </rules>
                  </configuration>
                </execution>
              </executions>
            </plugin>
          </plugins>
        </build>
        [...]
      </project>
      

      但我不确定我是否真的理解了这个问题。如果这不是您想要的,也许您可​​以在配置文件中声明您的 JDK 特定依赖项并使用基于 JDK 版本的激活触发器。例如:

      <profiles>
        <profile>
          <activation>
            <jdk>1.5</jdk>
          </activation>
          ...
        </profile>
      </profiles>
      

      此配置会在JDK的版本以“1.5”开头时触发配置文件。

      【讨论】:

      • 感谢enforcer插件对我来说真的很有用,即使它不能完全解决我的问题。
      【解决方案3】:

      我相信这可以通过您的 pom 中的以下插件来解决:

      <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>2.1</version>
                      <configuration>
                          <source>1.6</source>
                          <target>1.6</target>
                      </configuration>
                  </plugin> 
      

      这里你的目标是 1.6 版本,或者编写你自己的版本

      【讨论】:

      • 不,正如我所说,这不是源和目标参数的问题,因为这仅影响编译器如何读取语言(源)和生成字节码(目标),而不影响编译中使用的库.如果你使用 1.6 jdk 编译一个项目,使用 1.5 作为源/目标参数,你仍然会得到一个对于使用 1.5 jre 执行无效的 jar(例如,库类中的重载方法可能会出现问题)。
      • @Andrea 那么 Pascal 解决方案就是答案
      • 我认为配置文件不能解决我的问题。在编译我的项目时,我需要强制 maven 使用特定的 jdk。最好的解决方案似乎是 Simone 提出的。
      猜你喜欢
      • 2017-03-21
      • 2016-09-18
      • 2023-03-10
      • 1970-01-01
      • 2020-07-26
      • 2019-01-24
      • 1970-01-01
      • 2016-05-23
      • 2023-04-01
      相关资源
      最近更新 更多