ジャーがEnunciateの展開から除外されるのはなぜですか?
質問
Enunciate を使用してプロトタイプREST APIを構築し、カスタムコードを含むjarを含める必要があります。ライブラリ。
私のAntスクリプトは次のようになります。
<!--include all jars-->
<path id="en.classpath">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</path>
<!--define the task-->
<taskdef name="enunciate" classname="org.codehaus.enunciate.main.EnunciateTask">
<classpath refid="en.classpath" />
</taskdef>
<mkdir dir="${dist}" />
<enunciate dir="${src}" configFile="${basedir}/enunciate.xml">
<include name="**/*.java" />
<classpath refid="en.classpath"/>
<export artifactId="spring.war.file" destination="${dist}/${war.name}" />
</enunciate>
問題は、カスタムjarがWARファイルから除外されていることです。 jarがコンパイル時に明らかにクラスパス上にあるが、enunciateがディストリビューションにそれを含めることに失敗するように、enunciateアノテーション付きクラスをコンパイルする必要があります。また、enunciateに必要ないくつかのjarファイルがWARファイルに含まれていないことにも気付きました。
それらが除外される理由と修正方法を教えてください
解決 2
インクルードしようとしているjarファイルの1つに、Enunciateが依存しているjarファイルのマニフェストファイル(freemarker)に依存関係がリストされていることがわかりました。 Enunciateは自動的にfreemarkerを除外しますが、一見するとfreemarkerに依存するものも自動的に除外するように見えます。コードのマニフェストファイル内の依存jarのリストからfreemarkerを削除すると、正常に機能します。
ただし; Enunciateのメイン開発者(Ryan Heaten)と話をしましたが、彼はこれが起こっているのではないことを保証します。以下に彼の回答を含めます。
本当に?
すごい。面白い。説明できない それ; Enunciateは何を見ていない 決定するためにマニフェストで 戦争に何を含めるか、だから私は ここで困惑しました。それも 奇妙なAntの振る舞い(ない その瓶を含む &quot; en.classpath&quot;いくつかの参照 理由)。
〜ライアン
他のヒント
enunciateを使用したことはありませんが、簡単なハックとして、jarを戦争に追加できます。
<jar jarfile="${dist}/${war.name}" update="true">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</jar>
注:おそらく、jarをルートディレクトリではなく WEB-INF / lib ディレクトリに追加する必要があります。
enunciateは、jarファイルに何を入れるべきかを最もよく知っているので、ennumiateがあなた自身のビルドプロセスに干渉するのを最小限に抑えていると推測しています。
enunciate.xmlで、ライブラリ自体をコピーしないように指示します:
<webapp doLibCopy="false">
次に、enunciateタスクの最後にあるantビルドファイルで戦争を更新します(これにより、上記の手順でEnunciateがjarをコピーしているかどうかにかかわらず、含まれる/除外されるjarを更新できます):
<war destfile="build-output/{mywar}" update="true">
<lib dir="WebContent/WEB-INF/lib">
<include name="**/*.jar" />
</lib>
<lib dir="build-output">
<include name="some_other.jar" />
</lib>
</war>