Maven - 使用JDK 7编译JVM 5

Ale*_*ian 10 java jdk1.5 maven

我一直试图让它工作一段时间,但还没有运气.

我想JAVA_HOME指向JDK7但是我想为JVM 5编译一个项目.我已经阅读了文档,我在SO上发现了类似的帖子,但它们似乎都没有在我的设置中工作.

我首先尝试设置target,source但我收到了一个错误:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

[ClassName]不是抽象的,不重写抽象方法getParentLogger()CommonDataSource

据我所知,在JDK 7中更新了类,并且添加了抛出错误的额外方法.我需要使用具有旧实现的JDK 5的运行时,一切都应该正常工作.所以我这样做:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <verbose>true</verbose>
        <source>1.5</source>
        <target>1.5</target>
        <compilerArguments>
            <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我在我的系统上正确设置了JAVA5_HOME,我可以看到它在日志中加载了正确的类,但是我遇到了另一个错误:

[loading ZipFileIndexFileObject[c:\Program Files\Java\jdk1.5.0_22\jre\lib\rt.jar(*.class)]]
...
...
[ClassName]错误:包javax.crypto不存在

这是公平的,因为我没有包括jce.jar(加密类)bootclasspath.但是有一件事让我感到困惑.即使bootclasspath只包含Java 5运行时,我在类路径中有很多来自JRE7的库.它们没有在任何地方指定.

[类文件的搜索路径:c:\ Program Files(x86)\ Java\jdk1.5.0_22\jre\lib\rt.jar,c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\dnsns.jar,c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\localedata.jar,c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunec.jar, c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunjce_provider.jar,c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunmscapi.jar,c:\ Program Files\Java\jdk1.7.0_02\jre\lib\ext\zipfs.jar,...]

如果我尝试添加jce.jar(来自JRE5),我会回到第一个错误:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <verbose>true</verbose>
        <source>1.5</source>
        <target>1.5</target>
        <compilerArguments>
            <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

类型[ClassName]必须实现继承的抽象方法CommonDataSource.getParentLogger()

我也看不到rt.jar被加载的痕迹,但我没有得到一个java.lang未找到的错误,所以在类路径上加载了一些类.

我会通过制作一个JAVA_HOME在构建之前覆盖的批处理脚本并稍后将其设置回来暂时修复它,但我真的希望这样做是正确的.这似乎不是一个极端的用例.:)

我在这做错了什么?

hoi*_*jui 5

这个答案针对的是问题的标题,而不是针对问题的具体问题.

我最终在我的项目中使用了这个解决方案,它允许我通过激活maven配置文件选择性地使用自定义引导类路径.我强烈建议为此使用配置文件,否则它会使没有设置环境变量的任何人的构建失败(非常糟糕,特别是对于开源项目).我只在IDE中激活此配置文件以进行"清理和构建"操作.

    <profile>
        <id>compileWithJava5</id>
        <!--
            NOTE
            Make sure to set the environment variable JAVA5_HOME
            to your JDK 1.5 HOME when using this profile.
        -->
        <properties>
            <java.5.home>${env.JAVA5_HOME}</java.5.home>
            <java.5.libs>${java.5.home}/jre/lib</java.5.libs>
            <java.5.bootclasspath>${java.5.libs}/rt.jar${path.separator}${java.5.libs}/jce.jar</java.5.bootclasspath>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.5</source>
                        <target>1.5</target>
                        <compilerArguments>
                            <bootclasspath>${java.5.bootclasspath}</bootclasspath>
                        </compilerArguments>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 1

如果需要,您可以在 maven-compiler-plugin 上使用 bootclasspath 配置选项:

<compilerArguments>
    <bootclasspath>xxxxxxxxx</bootclasspath>
</compilerArguments>
Run Code Online (Sandbox Code Playgroud)

你可以在这里读更多关于它的内容。请参阅示例下的注释。