2012-10-29 12 views
11

Serwer CI (Hudson), za który jestem odpowiedzialny, buduje projekt Maven. Po ostatnim popełnienia, kompilacja nie powiodła się:Maven nie może skompilować klasy, która zależy od 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 

Wymagana klasa (com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream) znajduje się w rt.jar.

próbowałem (zgodnie z instrukcją na http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies), aby dodać zależność systemu w pom.xml projektu:

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

Nie pomogło.

Najciekawsze jest to, że wszystkie pliki zostały skompilowane dobrze na lokalnym komputerze mojego kolegi (używa on wbudowanego kompilatora Eclipse).

W Internecie znalazłem to samo pytanie (link: http://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-class-td107361.html). Ostatnią odpowiedzią było to, że przyczyną tego problemu jest kompilacja Javy Oracle.

Tak więc zmieniłem jdk Oracle na OpenJDK, ale to nie pomogło.

Czy ktoś ma jakieś sugestie, jak rozwiązać ten problem?

+0

Używam ByteOutputStream i otrzymuję ten błąd. Kiedy zmieniłem go na ByteArrayOutputStream, zadziałało to jak urok. Nigdy nie wiedziałem o klasach wewnętrznych JRE. – Anshuman

Odpowiedz

5

Brakująca klasa wydaje się być wewnętrznym środowiskiem JRE (jak wskazano w jego przestrzeni nazw) i nie należy się do niego odwoływać z Twojego kodu. Jest prawdopodobnie dostępny tylko na określonych platformach lub wersjach JRE.

Rozważ zastąpienie go inną klasą kodera Base64, np. jeden z Apache Commmons Codec project.

+1

Cóż, to było specjalne rozwiązanie, a co z innymi zajęciami? Na przykład Niebezpieczny? Nie ma dobrego, znanego zamiennika, a używanie go wymaga zależności od słońca. * Klasy, co możemy zrobić w gradle? –

+0

Niestety nie jestem zaznajomiony z tą klasą. Może to jednak dobry temat na zupełnie nowe pytanie. – Henrik

+1

Od wersji 6 nie trzeba już szukać zewnętrznych narzędzi programu Base64: są one w 'javax.xml.bind.DatatypeConverter', który jest technicznie częścią JAXB, ale można go używać niezależnie od tego, czy używasz JAXB, czy nie. – peterh

11

Należy podać i dodać zależność rt.jar i <fork>true</fork>, ponieważ wtyczka kompilatora w przeciwnym razie po cichu upuści dowolne flagi -XD: np.

... 
    <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> 
      ... 
Powiązane problemy