maven-antrun-plugin 1.6 хочет скомпилировать классы с версией Java 1.4.2 - PullRequest
3 голосов
/ 11 августа 2011

Я использую 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 из текущей JVM версии 1.5, версия файла класса не делает 't match (версия 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.

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Я могу собрать его с помощью следующей команды.

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

0 голосов
/ 11 августа 2011

Более новые версии JDK могут компилировать код для запуска на старых JDK. Просто установите вашу цель на 1.4, если это версия JDK на вашем сервере.

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, часть вашего pom, которая вызывает целевую версию $ $ java-version}. Это будет передано в javac в качестве целевой опции. Вы хотите сказать это 1.4, так как младшие номера версий не используются.

...