2009-07-27 2 views
20

일반적인 제 3 자 jar 파일에 의존하는 Java jar 파일을 작성하는 빌드 기술을 재구성하려고합니다. (GlazedLists, Apache Commons 등)ant, jar 파일 및 Class-Path oh 내

나는 JRE에서 자동으로 볼 수 있도록 {Java JRE dir}/lib/ext에이 모든 것을 집어 넣었지만, 특정 jar 파일을 배포하기 때문에 좀 더 명확하게 배우고 싶습니다. 경로를 구축 이클립스에 추가, 일반 \ \ \ APPL \ 자바, aand가 내 개미 파일이 정의 :

그래서 저는 C로 모든 이동 내가 가진

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

내 클래스 경로 매니페스트 헤더가 "."로 설정되었습니다. 내 jar 작업에 있지만 관련 jar 파일을 응용 프로그램 jar 파일과 동일한 디렉토리에 넣어도 작동하지 않는 것 같습니다. 클래스 패스 헤더에 수동으로 하나씩 추가 할 수는 있지만, 클래스 패스 헤더 설정을 올바르게하는 쉬운 방법이 있습니까?

답변

36

이 필요합니다 아마 당신은 볼 수 있듯이, 당신이 ${build}에 자바 클래스와 출력을 컴파일 한 가정

<path id="build-classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar"> 
    <classpath refid="build-classpath"/> 
</manifestclasspath> 
<jar jarfile="${dist}/lib/myprog.jar" 
    basedir="${build}" 
    includes="com/my/prog/**" > 
    <manifest> 
     <attribute name="Main-Class" value="com.my.prog.MyProg"/> 
     <attribute name="Class-Path" value="${lib.list}"/> 
    </manifest> 
</jar> 

. 또한 자루프를 ${dist}/lib으로 복사했다고 가정합니다.

즉 Maven과 Gradle과 같은 종속성을 기본적으로 지원하는 다른 빌드 시스템을 살펴 보는 것이 좋습니다. 이러한 다른 빌드 시스템은 이미 많은 공통 프로젝트 구조 및 빌드 작업을 통해 생각해 왔으므로 마지막 세부 사항까지 모든 것을 스크립팅 할 필요가 없습니다.

+1

아 ... 그게 내가 찾고 있던거야. 우수한! –

+0

흠. 수정 : $ {dist}/lib 디렉토리가 아직 존재하지 않기 때문에 새로운 빌드에서는 작동하지 않습니다. 작업의 실행을 지연시키는 방법이 있습니까? –

+0

DOH! 신경 쓰지 마라, 나는 내 항아리 파일의 루트 섹션에 를 넣었다. 단지 항아리 작업에 넣음으로써 그것을 고쳤다. 다시 한 번 감사드립니다 !!!!! –

0

클래스 패스 디렉토리는 기본적으로 보안상의 이유로 Jar 파일을 포함하지 않습니다. 누군가는 거기에 jar 파일을 배치 할 수 있으며 사용자가 모르는 사이에 코드를 무시하고로드 할 수 있습니다. Jar 파일을 클래스 패스에 추가 할 수 있도록 다른 플래그 또는 종료 토큰을 추가하는 것에 대한 논의가 있었지만 내 메모리가 제공되면 버전 7로 예정되어 있다는 것을 알고 있습니다. 그러나 마지막 부분에서는 잘못 될 수 있습니다.

0

jar 파일의 클래스 경로 매니페스트 헤더에 포함 할 jar 파일을 명시 적으로 나열해야합니다. 클래스 경로에 디렉토리를 나열하면 Java가 해당 디렉토리에서 .class 파일을 찾지 만 jarfiles는 찾지 않음을 의미합니다.

4

원하는 것은 mapper입니다. Flattenmapper가 가장 쉽지만 클래스 경로를 지정하는 경로 요소를 만든 다음 경로 변환을 사용하여 매니페스트에 포함될 수있는 문자열로 변환해야합니다.

편집 : 당신이 개미에있어 때문에, 당신은 아마 전환하기를 원하지만 메이븐하지 않는 당신은 경로 요소를 구축하는 규칙을 포함 사용할 수 있습니다, 그래서 단지로 끝나는 디렉토리에있는 모든 **/*.jar

-1

것 모든 의존성을 확인하는 데 꽤 능숙하며 분배 목적으로 lib jar를 함께 복사하거나 결합하는 여러 가지 기능이 있습니다. 내 목적을 위해 나는 빌드 할 때 실행 스크립트를 생성하는 Maven 플러그인을 가지고있다.이 플러그인은 나를 위해 클래스 패스를 설정하므로 걱정할 필요가 없다. 이 모든입니다

+0

아이비는 의존성 관리를 할 수있는 꽤 개미 호환 방법입니다. –

3

개미 1.7 이후에는 매니페스트 클래스 경로 작업이 앞으로 진행됩니다. 1.7 이전 버전의 ant를 사용하는 경우 manifestclasspath 작업이 존재하지 않습니다.

다음은 동일한 결과를 제공합니다 : -

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

<pathconvert property="lib.list" pathsep=" "> 
    <path refid="build.classpath" /> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper /> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

<target name="generate.jar"> 
    <jar destfile="${dist}/lib/myprog.jar"> 
     <manifest> 
      <attribute name="Main-Class" 
       value="com.mypackage.MyClass" /> 
      <attribute name="Class-Path" value="${manifest.classpath}" /> 
     </manifest> 
    </jar> 
</target>