maven-antrun-plugin 1.6 想用Java 1.4.2 版本编译类

Posted

技术标签:

【中文标题】maven-antrun-plugin 1.6 想用Java 1.4.2 版本编译类【英文标题】:maven-antrun-plugin 1.6 want to compile classes with Java 1.4.2 version 【发布时间】:2011-10-24 11:44:01 【问题描述】:

我正在使用 ant build.xml 生成类并使用 JDK 中的 tools.jar 编译它们。

我使用的是 MAVEN 2.2.1 版本。 JDK 1.5 来执行 MAVEN。由于 maven 2.2.1 版本只支持高于 JDK 1.5 的版本,所以我必须使用它。

这个 maven-antrun-plugin 不允许为编译器指定源或目标版本。 因此,生成的类是针对当前运行的 JVM JDK 编译的,使用它的 rt.jar 和插件依赖项中提供的 tools.jar(或放在 jvm 的 lib/ext 目录中)。

由于 Maven 在 1.5 JVM (jdk1.5.0_22) 中执行,我的项目需要使用 JDK 1.4.2 版本编译这些类,因为我要部署它们的服务器在 1.4 JVM 上运行,所以我当我从我的 Eclipse 或命令行使用 MAVEN 插件编译时出现异常。

我找不到告诉 antrun 使用不同的 java 版本编译我的类的方法。 我尝试了以下解决方法:

更改 tools.jar 依赖项以指向 1.4 版本 => 因为编译器使用当前运行的 1.5 JVM 中的 rt.jar,类文件版本不匹配(版本 49.0,预期为 48.0) 将依赖项添加到 1.4 rt.jar => 它不会改变任何内容,因为 rt.jar 应该在引导类路径中指定。

以下是我正在使用的示例代码。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>install</id>
            <phase>install</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <source>$java-version</source>
                <target>$java-version</target>
                <compilerVersion>$java-version</compilerVersion>
                <compilerArguments>
                    <classpath>$java.home/lib/tools.jar</classpath>
                    <classpath>$java.home/jre/lib/rt.jar</classpath>
                </compilerArguments>
                <tasks>
                    <ant antfile="WPSEjb_build.xml"/>
                </tasks>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>crimson</groupId>
            <artifactId>crimson</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>sun.jdk</groupId>
            <artifactId>tools</artifactId>
            <version>1.4.2</version>
            <scope>system</scope>
            <systemPath>$java.home/lib/tools.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>rt</artifactId>
            <version>$java-version</version>
            <scope>system</scope>
            <systemPath>$java.home/jre/lib/rt.jar</systemPath>
        </dependency>
    </dependencies>
</plugin>

我遇到了类似这样的异常。

WPSClient.java:22: cannot access java.lang.Object
 [wlwBuild] [Build] bad class file: C:\Java\jdk1.5.0_22\jre\lib\rt.jar(java/lang/Object.class)
 [wlwBuild] [Build] class file has wrong version 49.0, should be 48.0
 [wlwBuild] [Build] Please remove or make sure it appears in the correct subdirectory of the classpath.
 [wlwBuild] [Build] public static WPSServerRemote getWPSServer() throws MitchellException 
 [wlwBuild] [Build] ^
 [wlwBuild] [Build] 3 errors
 [wlwBuild] [Build] BUILD FAILED
 [wlwBuild] [Build] Compile failed; see the compiler error output for details.
 [wlwBuild] [Build] 
 [wlwBuild] java.lang.reflect.InvocationTargetException
 [wlwBuild] java.lang.reflect.InvocationTargetException
 [wlwBuild]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [wlwBuild]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 [wlwBuild]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 [wlwBuild]     at java.lang.reflect.Method.invoke(Method.java:592)
 [wlwBuild]     at workshop.core.Compile.start(Compile.java:19)
 [wlwBuild]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [wlwBuild]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 [wlwBuild]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 [wlwBuild]     at java.lang.reflect.Method.invoke(Method.java:592)
 [wlwBuild]     at workshop.core.Starter.invokeStart(Starter.java:34)
 [wlwBuild]     at workshop.core.Compile.main(Compile.java:9)
 [wlwBuild] Caused by: java.lang.NoClassDefFoundError: org/apache/crimson/tree/XmlDocument
 [wlwBuild]     at workshop.util.ide.PreferencesNode._export(PreferencesNode.java:540)
 [wlwBuild]     at workshop.util.ide.PreferencesNode.exportSubtree(PreferencesNode.java:820)
 [wlwBuild]     at workshop.util.ide.PreferencesNode.flush(PreferencesNode.java:984)
 [wlwBuild]     at workshop.core.App$15.run(App.java:1000)
 [wlwBuild]     at workshop.core.asynctask.AsyncTaskManager.showDialogWhileRunning(AsyncTaskManager.java:272)
 [wlwBuild]     at workshop.core.asynctask.AsyncTaskManager.showDialogWhileRunning(AsyncTaskManager.java:482)
 [wlwBuild]     at workshop.core.App.exit(App.java:994)
 [wlwBuild]     at workshop.core.CompileHelper.compile(CompileHelper.java:298)

请告诉我如何设置 JDK 1.4.2 版本以使用 maven-antrun-plugin 编译我的类。

【问题讨论】:

【参考方案1】:

较新版本的 JDK 可以编译代码以在较旧的 JDK 上运行。如果这是您服务器上的 JDK 版本,只需将您的目标设置为 1.4。

您可能需要查看 1.5 的 java compiler usage guide 并查看目标选项以更好地了解编译器如何处理此问题。

编辑:澄清一下,调用目标版本的 pom 部分是 $java-version。这将作为目标选项传递给 javac。你会想告诉它 1.4,因为没有使用次要版本号。

【讨论】:

嗨 Jon7,我正在尝试使用 Build.xml 中的以下 Weblogic Workshop 命令,但无法在 命令下提供 javac 信息,因此我希望在 maven- 下设置编译器信息antrun-plugin,但是直到现在我还没有得到任何答案,如何为这个插件提供不同的编译器信息。我的 build.xml 信息如下。 如何在 maven-antrun-plugin 下提供 jdk 1.4.2 作为编译器 所以你的意思是我必须通过 1.4 而不是 1.4.2 ?? 是的。没有理由使用旧的 jdk。所有新的 jdk 都可以为旧版本的 java 构建。 它不起作用....我无法为 ant 插件编译 JDK 1.4 或 1.4.2。我的意思是我不能太应用它。 Ant-Plugin 有问题。或者可能是我没有得到正确的答案。 请解释您所说的“它不起作用”和“我无法应用它”是什么意思。如果您收到错误消息,请发布。【参考方案2】:

我可以使用以下命令来构建它。

          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2</version>
            <executions>
              <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>             
              <executable>C:\test\Ejb.bat</executable>
            </configuration>
          </plugin>

我在Ejb.bat 文件下调用ant -f build.xml 构建命令。它使用了我在build.xml 下提供的所有配置,因此我现在可以使用 JDK 1.4.2 版本进行构建。

【讨论】:

以上是关于maven-antrun-plugin 1.6 想用Java 1.4.2 版本编译类的主要内容,如果未能解决你的问题,请参考以下文章

Maven插件maven-antrun-plugin的使用

如何从maven-antrun-plugin执行ant jar

带有 maven-antrun-plugin 的 Maven Ant BuildException ...无法找到 javac 编译器

未能执行目标 maven-antrun-plugin - GitHub 操作上的连接超时

Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop

在linux环境下,在eclipse中导入mahout-distribution-0.5,导入完成后好多错误,见图,请大侠们指教