developer tip

개미로 번들 항아리 만들기

copycodes 2020. 11. 28. 09:39
반응형

개미로 번들 항아리 만들기


일부 Java 프로젝트를 빌드하기 위해 Ant를 사용하고 있습니다.
일부에서는 lib/JAR 파일의 형식으로 외부 종속성을 포함 하는 디렉토리가 있습니다.

빌드하는 동안 디렉토리의 zipfilesetjar에 대한 번들 jar 파일 a에 추가하여 종속성과 함께 프로젝트의 코드를 포함하는 번들 jar를 만듭니다 lib/.

문제는 항아리를 추가하거나 이름을 변경할 때마다 build.xml파일 을 업데이트해야 zipfilesets한다는 것입니다. 특정 패턴의 모든 항아리를 포함하는 자동 방식으로 파일을 추가하는 방법을 찾을 수 없었기 때문 입니다 ( 예 lib/*.jar).

이 작업을 수행하는 더 좋은 방법이 있습니까?

이 작업을 위해 Ant Task를 작성하거나 Groovy의 ant API를 사용하여 프로그래밍 방식으로 수행하는 것을 고려했지만 "바닐라"ant를 사용하여이 작업을 수행 할 수있는 방법이 있는지 궁금합니다.


내 목표에는 다음과 같은 것이 있습니다.

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
    <zipgroupfileset dir="dist" includes="*.jar"/>
    <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/>

    <manifest>
        <attribute name="Main-Class" value="${main.class}"/>
        <attribute name="Class-Path" value="${mf.classpath}"/>
    </manifest>
</jar>

그리고 여기에 내 클래스 경로를 만드는 방법이 있습니다.

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

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

mf.classpath는 위에 게시 된 패키지 대상에서 사용됩니다. 이 부분은 다른 곳에서 복사했기 때문에 익숙하지 않습니다.

빠른 편집. Javac은 이러한 항아리에 대해서도 알아야합니다.

<path id="jars">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<target name="compile">
    <mkdir dir="${build.dir}"/>
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/>
</target>

를 사용합니다 zipgroupfileset. 예를 들면 :

<target name="jar">
    <jar destfile="foo.jar" basedir="${dir.classes}">
        <zipgroupfileset dir="lib" includes="*.jar"/>
    </jar>
</target>

zipgroupfileset함께 설명되어 우편 작업.


NetBeans를 사용하는 사람들을 위해 zipgroupfileset을 사용하여 번들로 제공되는 라이브러리로 JAR 아카이브를 만드는 방법은 다음과 같습니다.

<target name="-post-jar">

    <property name="store.jar.name" value="MyJarName"/>

    <property name="store.dir" value="dist"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

    <delete file="${store.dir}/temp_final.jar"/>
    <delete dir="${store.dir}/lib"/>
    <delete file="${store.dir}/README.TXT"/>
</target>

이 대상 정의를 build.xml 파일 끝에 추가했습니다. 대상 이름은 -post-jar입니다.


Here's an simple example of an ant target that will create a jar (named test.jar) that includes all jar files under the lib directory. Maybe this will solve your problem?

<target name="jar">
    <jar destfile="test.jar">
        <fileset dir="lib/" includes="**/*.jar" />
    </jar>
</target>

참고URL : https://stackoverflow.com/questions/1821803/creating-a-bundle-jar-with-ant

반응형