Ошибка компиляции Maven при включении перечисления

Я улучшаю (это слово?) проект, процесс сборки которого до сих пор полностью основывался на сценариях ant/shell.

Рассмотрим следующее перечисление

public enum ResourceType {
    A, B;
}

Следующий боб:

public ResourceTypeOwner {
    //set get resourceType property
}

И следующий фрагмент кода:

void foo(ResourceTypeOwner rto) {
    ResourceType resourceType = rto.getResourceType();
    switch (resourceType) {
    case A:
        handleA(resourceType); break;
    case B:
        handleB(resourceType); break;
    default:
        throw new RuntimeException("Unsupported resource type");
    }
}

Я получаю ошибку компиляции при сборке с помощью maven:

Не удается включить значение типа ResourceType. Разрешены только конвертируемые значения int или переменные перечисления.

pom.xml имеет следующую конфигурацию плагина для компиляции

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
            <compilerId>eclipse</compilerId>
            <compilerVersion>1.6</compilerVersion>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>org.codehaus.plexus</groupId>
                <artifactId>plexus-compiler-eclipse</artifactId>
                <version>2.2</version>
            </dependency>
        </dependencies>
    </plugin>
...
</plugins>

И ant (с org.eclipse.jdt.core.JDTCompilerAdapter), и eclipse строят/компилируют нормально. Я, очевидно, делаю что-то не так (если только это не ошибка плагина maven-compiler-plugin или plexus-compiler-eclipse, о которой не сообщается, что несколько маловероятно, включение перечислений не является ни плохим, ни ракетостроением). У кого-нибудь есть идея?

Дополнительные сведения о среде

$mvn -version Apache Maven 3.0.4 (r1232337; 17.01.2012 10:44:56+0200) Дом Maven: /home/d/dev/tools/apache-maven-3.0.4 Версия Java: 1.6.0_35 , поставщик: Sun Microsystems Inc. Домашняя страница Java: /opt/jdk1.6.0_35/jre Язык по умолчанию: en_US, кодировка платформы: UTF-8 Название ОС: «linux», версия: «3.2.0-40-generic», arch : "amd64", семейство: "unix"

ОБНОВИТЬ:

Стандартный компилятор JDK успешно компилирует определенный класс. Похоже на проблему plexus-compiler-eclipse 2.2.


person dkateros    schedule 13.05.2013    source источник
comment
Проверьте, есть ли у вас только один ResourceType в пути к классам (включая зависимости). Я полагаю, что у вас есть еще один (обычный) класс с таким же названием.   -  person AlexR    schedule 13.05.2013
comment
Я только что обыскал весь репозиторий mvn для классов с таким же именем. Их нет. Кроме того, это происходит с двумя разными перечислениями (это единственные случаи, когда перечисление включается во всем проекте). Наконец, переименовал перечисление в ResourceType123456 (с рефакторингом eclipse). Та же проблема. Спасибо, хотя.   -  person dkateros    schedule 13.05.2013
comment
вам нужно использовать компилятор eclipse? что не так с jdk?   -  person radai    schedule 13.05.2013
comment
Есть случаи с общим выводом, в основном, что javac не позволяет, а ecj делает. Рассмотрим ‹T› foo() и ‹T,V extends Serializable› bar(), а foo вызывает bar в теле своего метода. Javac также заставляет вас добавить второй параметр в foo. Я не предлагаю foo ДОЛЖЕН иметь только один параметр типа, но я не писал всю кодовую базу;)   -  person dkateros    schedule 13.05.2013
comment
У меня та же проблема. Это специфично для компилятора eclipse.   -  person Thorbjørn Ravn Andersen    schedule 12.06.2013


Ответы (2)


Я смог воспроизвести и нашел проблему.

Оказывается, параметр org.eclipse.jdt.core.compiler.compliance должен быть установлен на целевую версию, чтобы он мог распознавать java.lang.Enum.

Этот параметр устанавливается только plexus-compiler-eclipse, когда установлены оба targetVersion И optimize. [1]

Измените свой pom следующим образом, и он должен работать:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version> <!-- or 3.0 -->
    <configuration>
        <compilerId>eclipse</compilerId>
        <source>1.6</source>
        <target>1.6</target>
        <optimize>true</optimize>   <!-- add this line! -->

Я не уверен, почему в plexus-compiler-eclipse было решено, что оптимизация повлияет на уровень соответствия, так что на самом деле это обходной путь.

Кроме того, этого кода достаточно, чтобы вызвать проблему:

class Foo {
    static enum MyEnum { A }

    void foo() {
        switch ( MyEnum.A ) { case A: }
    }
}

[1] https://github.com/sonatype/plexus-compiler/blob/master/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java#L156

person Kenney    schedule 13.05.2013
comment
Проверим и подтвердим это завтра утром, когда вернемся на работу, но, похоже, пораньше спасибо. - person dkateros; 14.05.2013
comment
Уот! Почетное упоминание здесь! bo2framework.blogspot.gr/2013/06/mavenized.html - person dkateros; 08.06.2013

Не используйте компилятор eclipse в сборке Maven. Если опустить строку

    <compilerId>eclipse</compilerId>

все работает нормально, что показывает, что это проблема, специфичная для компилятора eclipse.

person Alexander Rühl    schedule 13.05.2013
comment
В моей конфигурации maven используется компилятор eclipse. Java7 не вариант. Я не понимаю, почему rt1==rt2 только тогда, когда перечисление является внутренним классом класса, выполняющего переключение. Обычный JDK компилирует определенные классы, это похоже на ошибку плагина plexus-compiler-eclipse. - person dkateros; 13.05.2013
comment
@dkateros: Извините, я полностью изменил свой ответ, поскольку обнаружил, что меня ведут в неправильном направлении. Но, как я уже сказал, все будет хорошо, если не использовать компилятор eclipse. Или есть особая причина, по которой вы используете его вместо обычного JDK? Всегда нужно стараться, чтобы IDE сборки maven не зависела. - person Alexander Rühl; 13.05.2013
comment
Спасибо за ответ. К сожалению, без компилятора eclipse сборка завершится с многочисленными проблемами: / Я разместил проблему в списке рассылки пользователей plexus. - person dkateros; 13.05.2013
comment
Компилятор eclipse может читать исходный код java 6 и генерировать 5-байтовый код java. Это актуально для нас. - person Thorbjørn Ravn Andersen; 12.06.2013
comment
dkateros: можете ли вы дать ссылку на список рассылки пользователей plexus и ваш вопрос к нему? Также можно найти мертвую ссылку на архив. - person Kutzi; 22.07.2013
comment
@kutzi как-то пропустил это, так или иначе, это сообщение: td5755885.html" rel="nofollow noreferrer">maven.40175.n5.nabble.com/ - person dkateros; 19.09.2013