Pregunta

Tengo un diseño de proyecto estándar para un proyecto java:

project /
    src /
        source_file_1.java
        ...
        source_file_N.java
    build /
          classes /
              source_file_X.class
              ...
          jar /
              MyJar.jar
    lib /
          SomeLibrary.jar
          SomeOtherLibrary.jar

Por lo que yo puedo decir, estoy construyendo el proyecto correctamente con Ant. Necesito fijar el atributo de clase de la ruta en el archivo de manifiesto de modo que mis clases pueden utilizar las bibliotecas necesarias.

La siguiente información relevante de build.xml

<target name="compile" depends="init">
    <javac srcdir="src" destdir="build\classes">
        <classpath id="classpath">
            <fileset dir="lib">
                <include name="**/*.jar" />
            </fileset>
        </classpath>
    </javac>
</target>

<target name="jar" depends="compile">
    <jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
        <manifest>
            <attribute name="Built-By" value="${user.name}" />
        </manifest>
    </jar>
</target>

Cualquier empuje en la dirección correcta es apreciado. Gracias

¿Fue útil?

Solución

En cuanto a mi archivo de generación de NetBeans-generados, me encontré con este fragmento en la tarea -do-jar-with-libraries:

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

En otras palabras, parece que sólo tiene que añadir otro atributo a la tarea de manifiesto que ya tiene.

Véase también el Manifiesto de tareas de documentación .

Otros consejos

Suponiendo que las bibliotecas no cambian la ubicación de la compilación de ejecutar el archivo JAR, se puede crear un elemento de la ruta a la ruta de clases fuera del objetivo de compilación de este modo:

<path id="compile.classpath">
    <fileset dir="lib" includes="**/*.jar"/>
</path>

A continuación, puede utilizar la ruta creada en el interior de su tarea javac en lugar de la ruta de clases actual.

<classpath refid="compile.classpath"/>

A continuación, puede utilizar la ruta para establecer un manifestclasspath.

<target name="jar" depends="compile">
    <manifestclasspath property="jar.classpath" jarfile="build\jar\MyJar.jar">
      <classpath refid="compile.classpath"/>
    </manifestclasspath>    
    <jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
        <manifest>
            <attribute name="Built-By" value="${user.name}" />
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </jar>
</target> 

El manifestclasspath genera una ruta de clases con el formato adecuado para su uso en el archivo de manifiesto que debe ser envuelto después de 72 caracteres. classpaths largas que contienen muchos archivos jar o trayectos largos pueden no funcionar correctamente sin necesidad de utilizar la tarea manifestclasspath.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top