1

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.jarCLASSPATHに明示的に追加しなくても実行が成功します。

更新と解決

受け入れられた答えを見ると、これは内部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

4

2 に答える 2

0

解決策は、javaの Ant タスクフォークプロパティを「true」に設定することでした。

<java classname ="${project.MainClass.name}" fork="true">
    <classpath refid="run.classpath"/>
</java>

forkが「true」に設定されている場合、rt.jar がrun.classpathに明示的に存在する必要はありません。

于 2013-01-20T20:03:45.363 に答える