2013-05-13 18 views
5

Sto mavenifying (è una parola?) Un progetto il cui processo di compilazione è stato finora basato interamente su script ant/shell.Errore di compilazione Maven all'accensione di enum

Si consideri il seguente enum

public enum ResourceType { 
    A, B; 
} 

Il seguente fagiolo:

public ResourceTypeOwner { 
    //set get resourceType property 
} 

E il seguente frammento di codice:

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

sto ottenendo un errore di compilazione quando si costruisce con Maven:

Impossibile attivare un valore di tipo ResourceType. Solo cabriolet sono consentiti int valori o variabili enum

Il pom.xml ha la seguente configurazione del plugin per la compilazione

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

Sia formica (con org.eclipse.jdt.core.JDTCompilerAdapter) ed Eclipse compilare/compilare bene. Ovviamente sto facendo qualcosa di sbagliato (a meno che non si tratti di un plug-in maven-compiler-plugin o plexus-compiler-eclipse plugin non segnalato, il che è alquanto improbabile, accendere enumerazioni non è né male né scienza missilistica). Qualcuno ha un'idea?

Ulteriori dettagli dell'ambiente

$ MVN -version Apache Maven 3.0.4 (r1232337; 2012-01-17 10: 44: 56 + 0200) Maven casa:/home/d/dev/strumenti /apache-maven-3.0.4 Versione Java: 1.6.0_35, vendor: Sun Microsystems Inc. Java home: /opt/jdk1.6.0_35/jre Impostazioni locali predefinite: en_US, codifica piattaforma: UTF-8 Nome sistema operativo: " Linux", la versione: "3.2.0-40-generico", arco: "amd64", la famiglia: "unix"

UPDATE:

Il compilatore JDK standard compila correttamente la classe specifica. Sembra un problema di plexus-compiler-eclipse 2.2.

+1

Verificare se si dispone di un solo 'ResourceType' nel classpath (incluse le dipendenze). Credo che tu abbia un'altra classe (regolare) con lo stesso nome. – AlexR

+1

Ho appena cercato l'intero repository mvn per le classi con lo stesso nome. Non ce ne sono. Inoltre, accade su due Enum diversi (questi sono gli unici casi in cui un enum viene attivato sull'intero progetto). Finalmente ribattezzato enum su ResourceType123456 (con refact dell'eclisse). Stesso problema. Thx però. – dkateros

+1

devi usare il compilatore eclipse? cosa c'è di sbagliato in quello jdk? – radai

risposta

4

Sono stato in grado di riprodurre e ho trovato il problema.

Si scopre che l'impostazione org.eclipse.jdt.core.compiler.compliance deve essere impostata sulla versione di destinazione in modo che sia possibile riconoscere java.lang.Enum.

Questa impostazione è impostata solo da plexus-compiler-eclipse quando è impostato sia targetVersion AND optimize.[1]

Modificare la pom come questo e dovrebbe funzionare:

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

Io non sono sicuro perché è stato deciso nel plesso-compiler-eclipse che l'ottimizzazione possa modificare il livello di conformità, quindi questo è in effetti una soluzione.

Inoltre, questo codice è sufficiente per attivare il problema:

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

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

+0

Esaminerà e confermerà questo domani mattina una volta tornato al lavoro, ma sembra che un primo grazie sia in regola. – dkateros

+0

Accettato. Grazie ancora. – dkateros

0

Non utilizzare il compilatore eclipse in build Maven. Se si omette la linea

<compilerId>eclipse</compilerId> 

tutto funziona bene, il che dimostra che si tratta di un problema specifico per il compilatore Eclipse.

+0

La mia configurazione di maven utilizza il compilatore di eclipse. Java7 non è un'opzione. Non vedo perché rt1 == rt2 solo quando l'enum è una classe interna della classe che fa lo switch. Normal JDK compila le classi specifiche, sembra un bug del plugin plexus-compiler-eclipse. – dkateros

+0

@dkateros: Scusate, ho completamente cambiato la mia risposta quando ho scoperto che sono stato condotto in una direzione sbagliata. Ma come ho detto, andrà bene quando non si usa il compilatore di eclipse. O c'è un motivo particolare per usarlo al posto del normale JDK? Si dovrebbe sempre provare ad avere il Maven costruire IDE agnostico. –

+0

Grazie per la risposta. Sfortunatamente, la compilazione fallirà con numerosi problemi senza il compilatore di eclipse:/Ho postato il problema sulla mailing list degli utenti di plesso. – dkateros

Problemi correlati