문제

아래 빌드 파일에서 JAR 대상은 Manifest 클래스 경로의 Jar.class.path 속성을 나타냅니다. 컴파일 대상은 project.class.path를 나타냅니다

jar.class.path 및 project.class.path가 매우 유사하기 때문에 여기에는 중복성이 있습니다. 라이브러리가 추가 될 때 두 업데이트해야합니다. 라이브러리 목록이 매우 길어지면 통증이 될 수 있습니다. 더 좋은 방법이 있습니까? 모든 솔루션은 교차 플랫폼이어야하며 항상 상대 경로를 사용해야합니다.

편집하다:
다른 방법이 아닌 파일 세트에서 Jar ClassPath를 생성해야하므로 와일드 카드를 사용하여 모든 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>
도움이 되었습니까?

해결책

개미 1.7 이상을 가정하면 매니페스트 클래스 경로 직무.

<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>

자세한 내용은 확인하십시오 이 기사.

두 가지 (또는 그 이상) 경로 사이에 공통 하위 경로를 공유하려는 경우 쉽게 수행 할 수 있습니다.

<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>

당신이 사용할 수있는u003Cpathconvert> 파일 세트를 포함 할 수있는 경로를 일반 문자열로 변환합니다. 당신은 필요할 것입니다u003Cecho> 해당 문자열은 파일에 사용하십시오u003Creplace> 또는u003Creplaceregexp> 선행 경로 비트를 자르려면 마침내u003Cloadfile> 조작 된 문자열을 최종 속성에로드합니다.

구현은 독자에게 연습으로 남았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top