Как скомпилировать этот код с помощью Java 10, Ant и компилятора Eclipse?

Я пытаюсь скомпилировать этот простой код с помощью Java 10, Ant и компилятора Eclipse:

import java.util.ArrayList;
import javax.xml.bind.JAXBException;

class Test {
    void foo() throws JAXBException {
        throw new JAXBException("hi there");
    }

    void bar() {
        new ArrayList<String>();
    }
}

Я использую Ant-файл:

<project name = "Java 10 test">

    <target name = "compile-javac" depends = "clean, print-version-info">
        <javac release = "10" includeantruntime = "false">
            <src path = "."/>
            <compilerarg value = "--add-modules"/>
            <compilerarg value = "java.xml.bind"/>
        </javac>
    </target>

    <target name = "compile-ecj-4.7" depends = "clean, print-version-info">
        <javac compiler = "org.eclipse.jdt.core.JDTCompilerAdapter"
            release = "10" includeantruntime = "false">
            <src path = "."/>
            <compilerclasspath>
                <pathelement path = "ecj-4.7.3a.jar"/>
            </compilerclasspath>
            <compilerarg value = "--add-modules"/>
            <compilerarg value = "java.xml.bind"/>
        </javac>
    </target>

    <target name = "compile-ecj-4.8" depends = "clean, print-version-info">
        <javac compiler = "org.eclipse.jdt.core.JDTCompilerAdapter"
            release = "10" includeantruntime = "false">
            <src path = "."/>
            <compilerclasspath>
                <pathelement path = "ecj-4.8RC2.jar"/>
            </compilerclasspath>
            <compilerarg value = "--add-modules"/>
            <compilerarg value = "java.xml.bind"/>
        </javac>
    </target>

    <target name = "clean">
        <delete file = "Test.class"/>
    </target>

    <target name = "print-version-info">
        <echo message = "Java home is ${java.home}"/>
        <echo message = "Java version is ${java.version}"/>
        <echo message = "Ant version is ${ant.version}"/>
    </target>

</project>

Код компилируется нормально, если я использую javac (цель compile-javac), но я не могу заставить его работать с компиляторами Eclipse 4.7.3a или 4.8RC2:

  • с 4.7.3a я получаю ошибку параметризованные типы доступны только в том случае, если уровень источника равен 1,5 или выше., хотя я указываю release = "10"
  • с 4.7.3a, если я использую source = "10" and target = "10" вместо release = "10", ошибка исходного уровня исчезает, но я получаю ошибку недопустимое имя модуля: javax.xml.bind
  • с 4.8RC2 я получаю ошибку исходного уровня и другую ошибку JAXBException не может быть разрешен для типа, хотя я указываю, что хочу добавить модуль java.xml.bind, в котором определено JAXBException.

Целевой объект print-version-info дает в качестве вывода следующее:

print-version-info:
     [echo] Java home is C:\Program Files\Java\jdk-10
     [echo] Java version is 10
     [echo] Ant version is Apache Ant(TM) version 1.10.3 compiled on March 24 2018

Может быть, это продолжение ошибка ecj 487421, или я просто не понимаю параметры командной строки?

Довольно интересно, поскольку ANT заявляет, что игнорирует исходный и целевой атрибут версии> 1.9 и при выполнении на Java> = 9. ant.apache.org/manual/Tasks/javac.html

Rainer 05.06.2018 09:45

Вы пробовали параметр "modulepath"? Та же ссылка

Rainer 05.06.2018 09:48

@Rainer: ты прав, я могу компилировать при добавлении --module-path = $ {java.home} / jmods, но только при использовании 4.8, а не 4.7.3a. Там я все еще получаю ошибку исходного уровня. Я не думаю, что добавление пути к модулю для JDK необходимо, думаю, я обнаружу ошибку с ребятами из JDT.

ph8c4 05.06.2018 10:32

Это ошибка, которую я открыл: bugs.eclipse.org/bugs/show_bug.cgi?id=535552

ph8c4 05.06.2018 13:45

Спасибо - было бы неплохо, если бы вы здесь прокомментировали результаты устранения ошибки в качестве ответа. Ваше здоровье

Rainer 06.06.2018 09:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
2 386
0

Другие вопросы по теме