2013-02-01 1 views
4

여러 프로젝트에서 동일한 build.xml 파일을 재사용하려고하는 시나리오가 있습니다. 각각의 경우 최종 목표는 JAR이 모두 처리하는 dist입니다. 유일한 차이점은 프로젝트 중 일부는 src/main/java/META-INF/* 디렉토리이고 일부는 그렇지 않다는 것입니다 (그리고 단지 src/main/java/* 디렉토리가 있음).Ant Contrib 선택적 JAR META-INF의 경우

빌드에 src/main/java/META-INF/* 디렉토리가있는 것으로 확인되는 경우, 개미 도용 <if/> 작업을 사용하여 원하는 경우 META-INF/ 디렉토리를 정의하고 싶습니다. 이 같은 뭔가 :

<jar jarfile="myapp.jar"> 
    <if> 
     <available file="src/main/java/META-INF" /> 
     <then> 
      <!-- 
       Copy everything from src/main/java/META-INF into 
       the JAR's META-INF directory. 

       But how?!? 
      --> 
      <echo message="I'm trying to copy META-INF!" /> 
     </then> 
    </if> 
</jar> 

하지만 여기에 두 가지에 질식하고있다 :이 목표를 실행하면

  1. , 나는 내용의 빌드 예외가 그 I 수있는 <jar/> 내부 중첩하지 <if/> 태스크; 그리고
  2. META-INF 디렉토리를 클래스 경로의 루트에 생성하고 src/main/java/META-INF 내용을 모두 복사하는 방법을 잘 모르겠습니다.

의견이 있으십니까? 미리 감사드립니다.

+1

그래서 다른 디렉토리의 jar 파일에 클래스를 포함하고 src/main/java/META-INF의 내용을 선택적으로 META-INF로 포함 하시겠습니까? 그렇다면 jar 작업 내에서 metainf 중첩 요소를 사용할 수 있습니다. 매니페스트 파일 중 하나입니까? –

+0

감사합니다. @martin clayton (+1) - MANIFEST.MF를 사용하는 것에 반대하지는 않았지만 현재 프로젝트에는 (적어도 명시 적으로 정의하지 않은) 프로젝트가 없습니다. 그래서 더미/빈 manfiest를 만들거나 Ant가 나를 위해 하나 만들어야한다면, 나는 그걸로 충분합니다. 하지만 귀하의 질문에 대답 : 매니 페스트는 현재 파일 중 하나가 아닙니다. –

답변

1

그것은 소리 구성. 어떻게이 개 목표를하는 것에 대한 : 당신이 당신의 META-INF/ 함유 프로젝트를 빌드 할 때

<target name="jar"> 
    <!-- Normal JAR tasks like you currently have (sans the metainf stuff). --> 
</target> 

<target name="jar-with-metainf"> 
    <jar destfile="test.jar"> 
     <fileset dir="classes"/> 
     <metainf dir="src/main/java/META-INF"/> 
    </jar> 
</target> 

그런 다음, 당신은 단지 jar-with-metainf를 실행합니다.

1

<if> 그 자체가 작업이므로 <jar> 작업 내에서 다른 작업을 중첩 할 수 없다는 메시지가 정확합니다.

<if> 
    <available file="src/main/java/META-INF" /> 
    <then> 
     <fileset id="src.metainf" dir="src/main/java/META-INF" /> 
    </then> 
    <else> 
     <fileset id="src.metainf" dir="." excludes="**/*" /> 
    </else> 
</if> 

<jar destfile="myapp.jar"> 
    <metainf refid="src.metainf" /> 
</jar> 

JB Nizet points out으로 당신이 실제로이 특정 질문에 답이 필요하지 않습니다 : 그러나 당신이 할 수있는 것은 JAR이를 포함 REFID를 사용하여 다음 ID로 적합한 파일 세트를 정의 할 수 <if> 작업을 사용하다 하지만 다른 상황을 인식하는 것은 유용한 트릭입니다. 파일 세트가 아닌 <path> 요소를 정의 할 때 더 유용합니다.

4

당신은 필요 이상으로 어렵게 만들고 있습니다. 다만 다음과 같은 작업을 사용하고, 그렇지 않은 경우 META-INF 폴더가 존재하는 경우 항아리에 포함되어 무시됩니다 : 당신이 더 모듈 빌드를 활용하려는처럼

<target name="dist"> 
    <jar destfile="test.jar"> 
     <fileset dir="classes"/> <-- or whatever directory you want to put in the jar --> 
     <metainf dir="src/main/java/META-INF" erroronmissingdir="false"/> 
    </jar> 
</target>