Maven - используйте JDK 7 для компиляции для JVM 5 - PullRequest
10 голосов
/ 06 февраля 2012

Я пытался заставить это работать некоторое время, но пока не получилось.

Я хочу работать с 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>

[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>

У меня правильно установлен 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Файлы \ 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>

Тип [ClassName] должен реализовывать унаследованный абстрактный метод CommonDataSource.getParentLogger ()

Я также не вижу никаких следов загрузки rt.jar, но я не получаю ошибку java.lang not found, поэтому некоторые пути загружаются в путь к классам.

I 'Я исправлю это временно, создав пакетный скрипт, который переписывает JAVA_HOME перед сборкой и сбрасывает его после войныДС, но я действительно хочу, чтобы это было сделано правильно.Это не похоже на такой крайний случай использования.:)

Что я здесь не так делаю?

Ответы [ 5 ]

5 голосов
/ 14 марта 2014

Этот ответ нацелен на заголовок вопроса, а не на конкретные проблемы вопроса в деталях.

В итоге я использовал это решение в своем проекте, что позволяет мнеиспользовать выборочный путь к классу начальной загрузки, активировав профиль 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>
3 голосов
/ 06 февраля 2012

Предыдущая версия Java, мы не особенно хороши в поддержке предыдущих версий Java. Для Java 7 это выглядит намного лучше.

Вот программа, которая должна компилироваться под любую версию.

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

$ javac -target 1.7 -source 1.7 Main.java
$ javac -target 1.6 -source 1.6 Main.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning
$ javac -Xbootclasspath:/usr/java/jdk1.6.0_29/jre/lib/rt.jar -target 1.6 -source 1.6 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.5.0_22/jre/lib/rt.jar -target 1.5 -source 1.5 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.4.0_30/jre/lib/rt.jar -target 1.4 -source 1.4 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.3.1_29/jre/lib/rt.jar -target 1.3 -source 1.3 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.2.2_017/jre/lib/rt.jar -target 1.2 -source 1.2 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.2 Main.java
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.1 Main.java
javac: invalid source release: 1.1
Usage: javac  
use -help for a list of possible options
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.0 -source 1.0 Main.java
javac: invalid target release: 1.0
Usage: javac  
use -help for a list of possible options

Если вам нужно скомпилировать для предыдущей версии Java, вам нужно предоставить путь начальной загрузки, в идеале для той версии Java, для которой вы хотите скомпилировать. Похоже, что Java 7 полностью поддерживает Java 1.2

1 голос
/ 01 октября 2013

Чтобы использовать несколько Jar-файлов в опциях компилятора Maven, используйте строку $ {path.separator} между jar-файлами:

<compilerArguments>
   <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jsse.jar</bootclasspath>
</compilerArguments>
1 голос
/ 11 февраля 2013

Проблема связана с обратной совместимостью Java 7.

Очень мало классов, которые не сохраняют обратную совместимость из-за невозможности решения проблем различной природы, DataSource является одним из них.

Таким образом, либо вы адаптируете свой класс для соответствия новым сигнатурам (даже в режиме обратной совместимости), либо вам придется использовать другую версию виртуальной машины.

Вы можете прочитатьдополнительная информация здесь: http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

1 голос
/ 06 февраля 2012

Вы можете использовать опцию конфигурации bootclasspath в плагине maven-compiler-plugin:

<compilerArguments>
    <bootclasspath>xxxxxxxxx</bootclasspath>
</compilerArguments>

Подробнее об этом можно прочитать здесь .См. Примечание под примером.

...