maven-antrun-plugin 1.6 хочет скомпилировать классы с версией Java 1.4.2
Я использую ant build.xml, который генерирует классы и компилирует их с помощью tools.jar из JDK.
Я использую версию MAVEN 2.2.1. JDK 1.5 выполнить MAVEN. Поскольку версия maven 2.2.1 поддерживает более высокую версию, чем JDK 1.5, я должен ее использовать.
Этот maven-antrun-plugin не позволяет указывать ни исходную, ни целевую версию для компилятора. Таким образом, сгенерированные классы скомпилированы с текущей запущенной JVM, которая является JDK, используя ее rt.jar и tools.jar, предоставленные в зависимостях плагина (или помещенные в каталог lib/ext jvm).
Поскольку Maven выполняется в 1.5 JVM (jdk1.5.0_22) требуется для моего проекта для компиляции этих классов с версией JDK 1.4.2, потому что сервер, на котором я хочу их развернуть, работает на 1.4 JVM, поэтому я получаю исключение пока я компилирую с плагином MAVEN из моего затмения или командной строки.
Я не мог найти способ сказать antrun для компиляции моих классов, используя другую версию Java. Я попробовал следующие обходные пути:
- измените зависимость tools.jar, чтобы она указала на версию 1.4 =>, так как компилятор использует rt.jar из текущей версии 1.5 JVM, версия файла класса не совпадает (версия 49.0, ожидается 48.0)
- добавить зависимость в 1.4 rt.jar => это ничего не меняет, так как rt.jar должен быть указан в загрузочном classpath.
Следующий пример кода, который я использую.
<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.
2 ответа
Более новые версии JDK могут компилировать код для запуска на старых JDK. Просто установите целевое значение 1.4, если это версия JDK на вашем сервере.
Возможно, вы захотите проверить руководство по использованию java-компилятора для 1.5 и опцию target, чтобы лучше понять, как компилятор справляется с этим.
РЕДАКТИРОВАТЬ: Чтобы уточнить, часть вашего pom, которая вызывает целевую версию ${java-version}. Это будет передано в javac в качестве целевой опции. Вы хотите сказать это 1.4, так как младшие номера версий не используются.
Я могу построить его с помощью следующей команды.
<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>
я звоню ant -f build.xml
построить команду под Ejb.bat
файл. Который использует всю конфигурацию, которую я даю под build.xml
так что теперь я могу собрать с версией JDK 1.4.2.