Antを使用してJAX-WSコードを実行しようとしていますが、javacターゲットは成功しますが、javaターゲットは次のように失敗します。
java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl
ここで、 Javaタスクで使用されるクラスパスに次のjarを明示的に追加すると、次のようになります。
/usr/lib/jvm/java-1.7.0-openjdk-i386/jre/lib/rt.jar
...実行は成功しますが、 JAVA_HOMEが適切に設定されているため、実行は必要ありません。
$ echo $JAVA_HOME
/usr/lib/jvm/java-7-openjdk-i386
さらに、使用しているJava Antのバージョンをエコーすると、次のようになります。
ant.java.version=1.7
これが私のAnt実行タスクの相対的なセクションです:
<echo message="ant.java.version=${ant.java.version}" />
<java classname="${project.MainClass.name}">
<classpath refid="run.classpath"/>
</java>
最後に、(Ant内からではなく)コマンドラインからコードを実行すると、rt.jarをCLASSPATHに明示的に追加しなくても実行が成功します。
更新と解決
受け入れられた答えを見ると、これは内部Sunクラスの使用に関連するより広範なクラスの問題の例だと思います。この回答で述べたように、内部Sunクラスに対して明示的にコンパイルするには、javac -XDignore.symbol.file
フラグを設定する必要があります。これはjavac
、デフォルトではファイルに対してリンクするのではなく、Sunのクラスの多く(すべてではない)を含むクラススタブを持つrt.jar
特別なシンボルファイルに対してリンクするためです。lib/ct.sym
クラスパスに明示的に追加することrt.jar
も、まったく同じ理由で問題を解決しますが、を使用する方がクリーンだと思いますjavac -XDignore.symbol.file
。(この回答で示唆されているように)がtrueに設定されているrt.jar
場合にAntが明らかにコンパイルされる理由については、まだわかりません。fork
振り返ってみると、CLASSPATHjavac
に含まれていないのは理にかなっていると思います。rt.jar