2012-10-29 19 views
11

CI-server (Hudson), di cui sono responsabile, crea il progetto Maven. Dopo l'ultimo commit, la generazione non riuscita:Maven non può compilare la classe che dipende da rt.jar

[INFO] ------------------------------------------------------------- 
[ERROR] COMPILATION ERROR : 
[INFO] ------------------------------------------------------------- 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[33,62] package com.sun.xml.internal.messaging.saaj.packaging.mime.util does not exist 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,5] cannot find symbol 
     symbol : class BASE64EncoderStream 
     location: class |fullname of MyClass| 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,38] cannot find symbol 
     symbol : class BASE64EncoderStream 
     location: class |fullname of MyClass| 
[INFO] 3 errors 

classe richiesta (com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream) si trova in rt.jar.

ho cercato (in conformità con le istruzioni a http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) per aggiungere la dipendenza del sistema in pom.xml del progetto:

<dependency> 
    <groupId>dummy</groupId> 
    <artifactId>dummy</artifactId> 
    <version>1</version> 
    <scope>system</scope> 
    <systemPath>${java.home}/lib/rt.jar</systemPath> 
</dependency> 

Non ha aiutato.

Il più interessante è che tutti i file sono stati compilati correttamente sulla macchina locale del mio collega (utilizza il compilatore di compilazione Eclipse).

In internet ho trovato la stessa domanda (link: http://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-class-td107361.html). L'ultima risposta è stata che il motivo di questo problema è il compilatore Java di Oracle.

Così, ho cambiato il jdk di Oracle in OpenJDK, ma non è stato d'aiuto.

Qualcuno ha qualche suggerimento su come risolvere questo problema?

+0

Stavo usando ByteOutputStream e ho ricevuto questo errore. Quando l'ho cambiato in ByteArrayOutputStream, ha funzionato come un fascino. Mai saputo delle lezioni interne di JRE. – Anshuman

risposta

5

La classe mancante sembra essere interna JRE (come indicato nel suo spazio dei nomi) e non deve essere referenziata dal codice. Probabilmente è disponibile solo su piattaforme specifiche o versioni JRE.

Prendere in considerazione la possibilità di sostituirlo con un'altra classe di encoder Base64, ad es. uno dal Apache Commmons Codec project.

+1

Beh, questa era una soluzione speciale, che ne è delle altre classi? Ad esempio, non sicuro? Non esiste un sostituto noto e il suo utilizzo richiede di dipendere dalle classi sun. *, Cosa possiamo fare a gradle? –

+0

Purtroppo non ho familiarità con quella classe. Potrebbe essere un buon argomento per una domanda completamente nuova, però. – Henrik

+1

Poiché Java 6 non ha più bisogno di andare all'esterno per trovare i programmi di utilità Base64: si trovano in 'javax.xml.bind.DatatypeConverter' che è tecnicamente parte di JAXB ma è possibile utilizzarlo indipendentemente dal fatto che si usi JAXB o meno. – peterh

11

È necessario specificare -XDignore.symbol.file e aggiungere la dipendenza rt.jar e <fork>true</fork> in quanto il plug-in del compilatore altrimenti salterà in modo silenzioso qualsiasi flag -XD: ad es.

... 
    <dependency> 
     <groupId>groupid</groupId> 
     <artifactId>artifiactId</artifactId> 
     <version>1.0</version> 
     <scope>system</scope> 
     <systemPath>${java.home}/lib/rt.jar</systemPath> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <compilerArgs> 
        <arg>-XDignore.symbol.file</arg> 
       </compilerArgs> 
       <fork>true</fork> 
      </configuration> 
      ... 
Problemi correlati