Antの中に<クラスパス>からマニフェストクラスパスを生成します

StackOverflow https://stackoverflow.com/questions/858766

  •  21-08-2019
  •  | 
  •  

質問

以下、ビルドファイルで、ジャーターゲットマニフェストクラスパスのjar.class.pathプロパティを指します。コンパイルターゲットはproject.class.pathを指す

jar.class.pathとproject.class.pathは非常に類似しているため、冗長性は、ここにあります。ライブラリはライブラリのリストが非常に長くなる場合は痛みをすることができ、追加されたとき、彼らは両方を更新する必要があります。より良い方法はありますか?任意の溶液は、クロスプラットフォームであると常に相対パスを使用する必要があります。

編集:
これは、ファイルセットではなく他の方法で回避からJARのクラスパスを生成する必要がありますので、私は、例えばワイルドカードを使用することができますディレクトリ内のすべてのJARファイルが含まれます。

<?xml version="1.0"?>
<project name="Higgins" default="jar" basedir=".">

    <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/>

    <path id="project.class.path">
      <pathelement location="build"/>
      <fileset dir="lib">
        <include name="forms-1.2.0.jar"/>
        <include name="BrowserLauncher.jar"/>
      </fileset>
    </path>

    <target name="prepare">
        <mkdir dir="build"/>
    </target>

    <target name="compile" depends="prepare" description="Compile core sources">
        <javac srcdir="src"
               includes="**"
               destdir="build"
               debug="true"
               source="1.5">
          <classpath refid="project.class.path"/>
        </javac>
    </target>

    <target name="jar" depends="compile" description="Generates executable jar file">
        <jar jarfile="higgins.jar">
            <manifest>
                <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/>
                <attribute name="Class-Path" value="${jar.class.path}"/>
            </manifest>
            <fileset dir="build" includes="**/*.class"/>            
            <fileset dir="src" includes="**/*.properties"/>         
        </jar>
    </target>

</project>
役に立ちましたか?

解決

上記のAnt 1.7を想定したり、あなたは manifestclasspath のタスクを使用することができます。

<path id="dep.runtime">
    <fileset dir="./lib">
        <include name="**/*.jar" />
    </fileset>
</path>
<property name="dep_cp" value="${toString:dep.runtime}" />

<target name="default">
    <manifestclasspath property="manifest_cp" jarfile="myjar.jar">
        <classpath refid="dep.runtime" />
    </manifestclasspath>
    <echo message="Build Classpath: ${dep_cp}" />
    <echo message="Manifest Classpath: ${manifest_cp}" />
</target>

他のヒント

<path id="build.classpath">
  <fileset dir="${basedir}">
     <include name="lib/*.jar"/>
  </fileset>
</path>

<pathconvert property="manifest.classpath" pathsep=" ">
  <path refid="build.classpath"/>
  <mapper>
    <chainedmapper>
       <flattenmapper/>
       <globmapper from="*.jar" to="lib/*.jar"/>
    </chainedmapper>
  </mapper>
</pathconvert>

<target depends="compile" name="buildjar">
  <jar jarfile="${basedir}/${test.jar}">
     <fileset dir="${build}" />
     <manifest>
       <attribute name="Main-Class" value="com.mycompany.TestMain"/>
       <attribute name="Class-Path" value="${manifest.classpath}"/>
     </manifest>
 </jar>
</target>

詳しくはこの記事をチェックアウトします。

あなただけの2つ(またはそれ以上)のパスの間で共有される共通のサブパスをしたい場合は、それが簡単にできます:

<path id="lib.path>
    <fileset dir="lib">
        <include name="forms-1.2.0.jar"/>
        <include name="BrowserLauncher.jar"/>
    </fileset>
</path>

<path id="project.class.path">
    <pathelement location="build"/>
    <path refid="lib.path"/>
</path>

<property name="jar.class.path" refid="lib.path"/>

編集申し訳ありませんが、私は質問を誤解しました。これを試してください:

<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/>

<path id="project.class.path">
    <pathelement location="build"/>
    <fileset dir="." includes="${jar.class.path}"/>
</path>

あなたはプレーンな文字列に(ファイルセットを含めることができます)のパスに変換するために、を使用することができます。あなたはおそらく、最終的に、最終的な性質に操作文字列をロードするために、<ロードファイル>を使用し、主要なパスビットをチョップするために、<置き換え>またはのいずれかを使用、ファイルに<エコー>その文字列する必要があります。

実装は、読者への課題として残されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top