【问题标题】:Hybrid JDK 1.7 Server 1.6 Client Maven Build of Artifacts混合 JDK 1.7 服务器 1.6 客户端 Maven 构建工件
【发布时间】:2013-03-16 01:30:17
【问题描述】:

我有一个包含服务器后端模块和客户端前端模块的 Maven 项目。目标是利用 JDK 7 中服务器后端模块的性能改进,但仅在 JDK 6 中构建客户端模块。客户端模块在 Tomcat 中运行,而服务器模块是独立的 Java 应用程序。

我知道针对特定 JDK 的 Maven 配置:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerVersion>1.6</compilerVersion>
          <fork>true</fork>
        </configuration>
      </plugin>
    </plugins>
  </build>

对这种方法的一个警告是,服务器模块和客户端模块都使用公共模块,每个模块需要两个不同的二进制文件(JDK 6 和 7)。

如何为 JDK 6 编译一组工件,为 JDK 7 编译另一组工件,以及为 JDK 6 和 7 都属于同一个项目的第三组工件(两者都使用)?是否有必要将模块分成三个独立的项目?

【问题讨论】:

    标签: maven java-7


    【解决方案1】:

    如果您 1.6,生成的 Jar 将在 1.6 和 1.7 中完美运行。无需编译两次。

    使用 1.7 编译器或针对 1.7 字节代码没有性能优势(可能在一些非常模糊的情况下除外)。所有的性能都存在于 JVM 中。只需将您的通用代码设为目标 1.6。除非您自己可以衡量编译 1.7 的速度优势,否则不要打扰。

    【讨论】:

    • 好点,但这不会牺牲 1.7 的性能优势吗?如果我没有其他选择,我想我可以使用在 1.6 中编译的共享模块来使用服务器模块。理想情况下,我希望所有服务器模块和依赖项都能从 JDK 1.7 以及所有使用 JDK 1.6 的客户端模块和依赖项中受益。
    • 修改后:我会立即尝试您的建议。
    【解决方案2】:

    bmargulies 的回答非常中肯。

    无论如何,如果你真的想构建某个模块的不同版本(1.6 和 1.7),我建议你使用 2 个配置文件,profile1 针对 jdk6,profile2 针对 jdk7。所以这两个配置文件都会重新定义 maven-compiler-plugin。

    这两个配置文件还可以使用不同的分类器重新定义 maven-jar-plugin,以便每个模块在 2 个版本中可用(并在您的依赖项中使用分类器,以便客户端使用 jdk6,服务器使用 jdk7)。

    这是另一个问题,其中包含有关如何执行此操作的更多详细信息:How to manage artifactory / maven artifact using different profiles

    【讨论】:

    • 感谢您的发帖,尽管对使用分类器和配置文件执行此任务有些不鼓励,但这是我的怀疑。尽管如此,验证。
    猜你喜欢
    • 2013-09-14
    • 2011-05-04
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2011-08-06
    相关资源
    最近更新 更多