Как включить папку lib в манифест classpath в Netbeans - PullRequest
2 голосов
/ 09 ноября 2009

Библиотека, которую использует мое java-приложение, ищет файл (log4j.xml) в пути к классам. Я использую netbeans для управления своим проектом, но не могу найти способ включить папку lib /.

Netbeans автоматически создает файл MANIFEST.MF внутри jar приложения, а также создает папку с именем lib /, которая включает все зависимости. Этот манифест определяет атрибут Class-Path, который переопределяет любой аргумент -cp, предоставленный в командной строке. Я могу выбрать произвольную папку на панели библиотеки netbeans, но она создает подпапку в пути к классам манифеста. Я хотел бы, чтобы все зависимости и файл log4j.xml находились в папке lib /.

Надеюсь, это возможно сделать в IDE. Я включил фрагмент автоматически сгенерированного файла build-impl.xml.

<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
    <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
    <pathconvert property="run.classpath.without.build.classes.dir">
        <path path="${run.classpath}"/>
        <map from="${build.classes.dir.resolved}" to=""/>
    </pathconvert>
    <pathconvert pathsep=" " property="jar.classpath">
        <path path="${run.classpath.without.build.classes.dir}"/>
        <chainedmapper>
            <flattenmapper/>
            <globmapper from="*" to="lib/*"/>
        </chainedmapper>
    </pathconvert>
    <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
    <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
        <fileset dir="${build.classes.dir}"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </copylibs>
    <echo>To run this application from the command line without Ant, try:</echo>
    <property location="${dist.jar}" name="dist.jar.resolved"/>
    <echo>java -jar "${dist.jar.resolved}"</echo>
</target>

Спасибо.

Ответы [ 4 ]

3 голосов
/ 18 февраля 2011

Вместо редактирования файла build-impl.xml вы должны добавить эту запись в файл build.xml. Когда вы изменяете в своем проекте что-либо, относящееся к созданию этого проекта, он генерирует новый файл build-impl.xml.

Вот пример того, что я положил в свой файл build.xml:

<target depends="init" name="-do-clean">
    <delete dir="${build.dir}"/>
    <delete file="${dist.jar}"/>
    <delete dir="${dist.dir}/lib"/>
    <delete dir="${dist.dir}/resources"/>
</target>

Поскольку я поместил это в файл build.xml, он переопределит раздел «-do-clean» файла build-impl.xml, который содержит:

<target depends="init" name="-do-clean">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
</target>

Кроме того, поскольку он находится в build.xml, он не будет изменен Netbeans.

1 голос
/ 17 августа 2012

Вы можете просто отключить опцию проекта Build / Packaging / Copy Dependent Library и вручную отредактировать manifest.mf в корневой папке вашего проекта (который является шаблоном для манифеста в jar-файле).

1 голос
/ 13 ноября 2009

Я нашел способ добиться этого, изменив build-impl.xml.

Я изменил:

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

до:

<attribute name="Class-Path" value="${jar.classpath} /lib"/>

Проблема в том, что netbeans перезапишет его, так как этот файл генерируется автоматически.

0 голосов
/ 10 ноября 2009

Похоже, что ваша проблема в «globmapper», который хранит ваш файл log4j.xml в / lib - вы хотите, чтобы он находился в «/» или на банке.

...