2012-10-29 40 views
11

私が担当しているCIサーバ(Hudson)は、Mavenプロジェクトをビルドします。最後にコミットした後、ビルドに失敗しました:Mavenは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 

必要なクラス(com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream)はrt.jar内に位置しています。

私は、プロジェクトののpom.xmlにシステム依存関係を追加する(http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependenciesの指示に従って)試してみました:

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

それは助けにはなりませんでした。

最も興味深いのは、私の同僚のローカルマシン上ですべてのファイルがコンパイルされていることです(彼はEclipseビルドインコンパイラを使用しています)。

インターネットで私は同じ質問を見つけました(リンク:http://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-class-td107361.html)。最後の答えは、この問題の原因がOracleのJavaコンパイラだということでした。

私はOracleのjdkをOpenJDKに変更しましたが、それは役に立ちませんでした。

誰かがこの問題の解決方法について提案していますか?

+0

私はByteOutputStreamを使用していましたが、このエラーが発生しました。 ByteArrayOutputStreamに変更すると、魅力的に機能しました。 JREの内部クラスについては決して知らなかった。 – Anshuman

答えて

5

欠落しているクラスは、(名前空間に示されているように)JRE内部であるようですが、コードから参照してはいけません。おそらく特定のプラットフォームまたはJREバージョンでのみ利用可能です。

別のBase64エンコーダクラス(たとえば、 1つはApache Commmons Codec projectからです。

+1

それは特別な解決策でしたが、他のクラスはどうですか?たとえば安全ではない?良い知られている交換がありません、それを使用して日光*クラスに依存する必要があります、私たちはgradleで何ができますか? –

+0

私は残念ながらそのクラスに精通していません。しかし、まったく新しい質問の良い話題かもしれません。 – Henrik

+1

Java 6以降、Base64ユーティリティを見つけるために外部に行く必要はなくなりました。これらはJAXBの技術的な部分である 'javax.xml.bind.DatatypeConverter'にありますが、JAXBを使用するかどうかにかかわらず使用できます。 – peterh

11

-XDignore.symbol.fileを指定し、コンパイラプラグインとしてrt.jarの依存関係と<fork>true</fork>を追加すると、-XDフラグが静かに破棄されます。

... 
    <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> 
      ... 
関連する問題