2009-03-25 17 views
8

que tienen un diseño de proyecto estándar para un proyecto java:Apache horm manifiesta class-path?

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 establecer el atributo class-path en el archivo Manifest para que mis clases puedan usar las bibliotecas requeridas.

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

Respuesta

8

Mirando mi fichero de construcción NetBeans-generados, me encontré con este fragmento en el -do-jar-with-libraries tarea:

<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 tu ya lo tienes.

Véase también Manifest Task documentation.

+0

Llegué a esta conclusión antes de responder, aunque no conocía jar.classpath. Estaba siendo expulsado por en la documentación ant http://ant.apache.org/manual/CoreTasks/manifestclasspath.html –

+0

oh sí y gracias –

+0

jar.classpath está definido por NetBeans en otra parte del archivo de compilación, I creer. –

37

Suponiendo que las bibliotecas no cambiar 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 dentro de su tarea javac en lugar de su classpath actual.

<classpath refid="compile.classpath"/> 

A continuación, puede usar la ruta para establecer un manifiesto classpath.

<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. Es posible que los classpaths largos que contienen muchos archivos jar o rutas largas no funcionen correctamente sin utilizar la tarea manifestclasspath.

+0

También con aplanar: http://stackoverflow.com/questions/858766/generate-manifest-class-path-from-classpath-in-ant – Vadzim