2013-05-13 4 views
5

Я являюсь mavenifying (это слово?) Проектом, процесс сборки которого до сих пор основывался исключительно на сценариях ant/shell.Сбой компиляции Maven при включении enum

Рассмотрим следующий пример Enum

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"); 
    } 
} 

Я получаю ошибку компиляции при сборке мавена:

Невозможно включить значение типа 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> 

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

Дополнительные детали окружения

$ MVN -версии Apache Maven 3.0.4 (r1232337; 2012-01-17 10: 44: 56 + 0200) Maven дом:/дом/D/Dev/инструменты /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-родовой", арка: "amd64", семья: "Юникс"

UPDATE:

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

+1

Проверьте, есть ли у вас только один 'ResourceType' в вашем пути к классам (включая зависимости). Я считаю, что у вас есть еще один (обычный) класс с тем же именем. – AlexR

+1

Я только что просмотрел весь mvn-репозиторий для классов с тем же именем. Их нет. Кроме того, это происходит на двух разных Enums (это единственные случаи, когда перечисление включено в весь проект). Наконец, переименовали enum в ResourceType123456 (с репликатором eclipse). Та же проблема. Thx, хотя. – dkateros

+1

Вам нужно использовать компилятор eclipse? Что случилось с jdk? – radai

ответ

4

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

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

Этот параметр устанавливается только с помощью слияния-слияния-слияния, когда установлены как , так и 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! --> 

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

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

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

+0

[github issue] (https://github.com/sonatype/plexus-compiler/issues/16) – Kenney

+0

Будет проверять и подтверждать это завтра утром однажды на работе, но похоже, что рано вам в порядке. – dkateros

+0

Принято. Еще раз спасибо. – dkateros

0

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

<compilerId>eclipse</compilerId> 

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

+0

В моей конфигурации maven используется компилятор eclipse. Java7 не вариант. Я не понимаю, почему rt1 == rt2, только когда enum является внутренним классом класса, выполняющего переключатель. Обычный JDK компилирует определенные классы, он выглядит как ошибка плагина plexus-compiler-eclipse. – dkateros

+0

@ dkateros: Извините, я полностью изменил свой ответ, когда обнаружил, что меня привели в неправильное направление. Но, как я сказал, это будет хорошо, если не использовать компилятор eclipse. Или есть особая причина, по которой вы используете его вместо обычного JDK? Нужно всегда стараться, чтобы агностик IDE с maven build. –

+0

Спасибо за ответ. К сожалению, сборка не удалась с многочисленными проблемами без компилятора eclipse:/Я разместил проблему в списке рассылки пользователей сплетения. – dkateros

Смежные вопросы