如何在POM中有一个额外的编译目标,它使用不同的Java版本?

时间:2014-07-25 17:28:46

标签: java maven

我有一个library,它通过内联标记使用。它旨在被其他库用于将示例代码插入到他们的JavaDoc中。

图书馆已经完成了, hallelujah ,截至昨天,它已经在Maven Central上了。

我现在第一次将这个库实现到另一个项目中。该项目使用java.version 1.5编译其代码。但是taglet库需要1.7。不仅用于运行javadoc.exe,还用于编译可选的“taglet定制器”类。


UPDATE :这些自定义程序类由每个开发人员创建 - 在他们的库中使用taglet库的人。自定义程序类(完全是可选的 - 它们只需要advanced features,并且您可以创建无),需要在执行javadoc.exe之前进行编译。


所以它需要以下目标:

  1. 编译主库类(需要Java 1.5)(mvn compile
  2. 编译自定义程序(需要Java 1.7)(mvn compilecodelet?)
  3. 运行javadoc.exe(Java 1.7)(`mvn docs'?)
  4. 因此,{p> mvn install会按顺序称这三个目标。

    我是Maven的新手,并希望了解如何做到这一点。这是我到目前为止所发现的:

    这是项目当前的compile目标:

    <properties>
        <java.version>1.5</java.version>
    </properties>
    
    <plugin>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>2.3.2</version>
       <configuration>
          <encoding>UTF-8</encoding>
          <source>${java.version}</source>
          <target>${java.version}</target>
       </configuration>
    </plugin>
    

    此项目的JDK似乎应该升级到1.7,主要类使用<source> and <target> flags设置为1.5编译,并且使用这些标志设置为1.7的taglet-customizers编译。 / p>

    一些参考文献:


    如何设置这个额外的compilecodelet目标,并设置整个项目以便它可以处理两个JDK版本?那么mvn install(以及其他任何“主”目标)也会以正确的顺序称这个新的子目标?

    正如我所说的,我是Maven的新手,虽然我开始理解点点滴滴,但我不知道如何将它们整合在一起。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我同意其他评论你问题的人的疑虑,做你提出的问题对我来说似乎有风险和容易出错。将codelet扩展类放在一个单独的项目中,使用source&amp; amp;来构建它们可能会更好。目标为1.7,并在库POM的javadoc插件配置中添加对codelet扩展jar的依赖。

但如果不可能,我会尝试这样的事情。这是未经测试但应该给你的想法。

假设这个目录结构:

basedir
  src
    main
      java
         regularLibCodePackage
         codeletExtensionPackage

<properties>
  <java.version>1.5</java.version>
  <!-- sets encoding for the whole Maven build -->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.3.2</version>  <!--consider using latest plugin version -->
  <configuration>
    <!-- applies to all executions unless overridden by an execution -->
    <source>${java.version}</source>
    <target>${java.version}</target>
  </configuration>
  <executions>
    <execution>
      <id>default-compile</id>
      <configuration>
        <excludes>
          <!-- Not sure exactly what the path should be here, the docs aren't 
               clear. Maybe it should be an absolute path, e.g. 
               ${project.basedir}/src/main/java/codeletExtensionPackage?
               When you figure it out let me know and I'll edit the response. -->
          <exclude>codeletExtensionPackage</exclude>
        </excludes>
      </configuration>
    </execution>
    <execution>
      <id>codelet-compile</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <excludes>
          <!-- See note above about what to put here -->
          <exclude>regularLibCodePackage</exclude>
        </excludes>
      </configuration>
    </execution>
  </executions>
</plugin>

您是否需要将1.7类保留在最终的jar中?换句话说,运行Javadoc插件只需要额外的类吗?如果答案为“是”,那么您还需要调整默认的jar插件执行。 (如果答案是肯定的,这是将codelet类放在一个单独的项目中的另一个原因!)

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.5</version>  <!--consider using latest plugin version -->
  <executions>
    <execution>
      <id>default-jar</id>
      <configuration>
        <excludes>
          <exclude>codeletExtensionPackage</exclude>
        </excludes>
      </configuration>
    </execution>
  </executions>
</plugin>

我在编译器和jar插件配置中使用了排除,还有一个伴随包含块。我留给你找出工作配置,这应该让你开始。