Как установить другой путь в build.xml - PullRequest
2 голосов
/ 10 февраля 2012

Я хочу указать путь к другому каталогу (который содержит jars, в настоящее время d:/ext_jars). После запуска build.xml. Я хочу, чтобы этот путь занял эту пригодную для работы банку.

В настоящее время jar выдает ошибки из-за отсутствия classpath (который ранее был в c:/project/lib/*.jars, преобразован в D:/ext_jars).

Пожалуйста, помогите мне, как я могу установить этот внешний каталог в classpath файла build.xml?


Мой код в: build.xml

<?xml version="1.0"?>
<project name="MyProject" default="deploy" basedir="." >
    <property file="manifest.mf" />
    <property name="dir.src" value="src" />
    <property name="dir.build" value="bin" />
    <property name="dir.dist" value="dist/MyProject" />
    <property name="dir.lib" value="lib" />
<!-- Creates the output directories -->
    <target name="prepare">
        <mkdir dir="${dir.build}" />
        <mkdir dir="${dir.dist}" />

        <mkdir dir="${dir.dist}/${dir.csvdata}" />
        <mkdir dir="${dir.dist}/${dir.MH}" />
    </target>

    <target name="clean" description="Remove all generated files.">
        <delete dir="${dir.build}" />
        <delete dir="${dir.dist}" />
    </target>

    <path id="build.classpath">
        <fileset dir="${dir.lib}">
            <include name="**/*.jar" />
            <include name="**/*.zip" />
        </fileset>
    </path>
    <path id="build.classpath.ref">
        <fileset dir="D:/ext_jars">
            <include name="**/*.jar" />
            <include name="**/*.zip" />
        </fileset>
    </path>

    <target name="compile" depends="prepare" description="Compile all source code.">
        <!--<javac srcdir="${dir.src}" destdir="${dir.build}" debug="true">-->
        <javac  destdir="${dir.build}" debug="true">
            <classpath refid="build.classpath" />
            <classpath refid="build.classpath.ref" />
            <src path="src"/>           
        </javac>        
        <copy todir="${dir.build}">
            <fileset dir="${dir.src}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>     
    </target>

    <pathconvert property="classpath" refid="build.classpath">
    </pathconvert>
    <pathconvert property="classpath" refid="build.classpath.ref">
    </pathconvert>

    <target name="jar" depends="compile" description="Generates ${project.name}.Jar in the 'dist' directory.">
        <jar jarfile="${dir.dist}/${ant.project.name}.jar">
            <fileset dir="${dir.build}" includes="**/*.*" />
            <manifest>
                <attribute name="Class-Path" value="${Class-Path}" />
                <attribute name="Main-Class" value="${Main-Class}" />
            </manifest>
        </jar>
    </target>
    <target name="deploy" depends="clean,jar">
        <copy todir="${dir.dist}/${dir.lib}">
            <fileset dir="${dir.lib}">
                <include name="**/*.jar" />
                <include name="**/*.zip" />
            </fileset>
        </copy>
    </target>

Использование этого кода. После запуска проекта он работает хорошо, но после запуска jar, созданного этим кодом, он не запускается, и выдает ошибку следующим образом:

Exception in thread "main" java.lang.NoClassDefFoundError: dowlibpkg/DowLib
        at mypkg.MainApp.main(MainApp.java:109)
Caused by: java.lang.ClassNotFoundException: dowlibpkg.DowLib
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

ТАК созданный Jar не работает ../ Я хочу, чтобы он был запущен, может кто-нибудь, пожалуйста, помогите мне

=============================================== ===============

manifest.mf

Манифест-Версия: 1.0 Путь к классу: lib / org.springframework.asm-3.0.1.RELEASE \ lib / org.springframework.beans-3.0.1.RELEASE \ lib / org.springframework.context-3.0.1.RELEASE \ lib / org. springframework.core-3.0.1.RELEASE \ lib / org.springframework.expression-3.0.1.RELEASE \ lib / org.springframework.oxm-3.0.1.RELEASE \ lib / org.springframework.web-3.0.1. РЕЛИЗ Основной класс: myProject.MainApp

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Есть несколько способов поиграться с java classpath, например, использовать параметры командной строки classpath или редактировать переменную CLASSPATH, но принципиально проблема, которую вы создаете для себя позже, заключается в том, что ваша сборка становится зависимой от определенной структуры каталогов.* Это затрудняет обмен вашим кодом и определенно раздражает других разработчиков, которые могут работать с вами.Иногда лучше пройти лишнюю милю и сделать ваши зависимости доступными на веб-сайте (или найти веб-сайт, на котором они уже доступны) и получить муравей для их загрузки, разархивировать, а затем каждый раз добавлять в путь к классам из одного и того же места (например, каталог build / lib, который вы создаете).

Конечно, управление зависимостями - это то, чем занимается Maven (http://maven.apache.org), так что, возможно, его также стоит посмотреть для вас.

Jeff

0 голосов
/ 10 февраля 2012

На основании некоторых подсказок из ссылок, которые я предоставил в моих комментариях, вы можете попробовать это (чего я не пробовал):

<target depends="init" name="build-projects">
    <property name="myproject.root.path" location="d:/ext_jars"/>

    <path id="class.path">
        <fileset dir="${myproject.root.path}">
            <include name="*.jar"/>
            <exclude name="${ant.project.name}.jar"/>
        </fileset>
    </path>

    <manifestclasspath property="jar.classpath" jarfile="${myproject.root.path}/${ant.project.name}.jar">
        <classpath refid="class.path"/>
    </manifestclasspath>

    <jar destfile="${myproject.root.path}/${ant.project.name}.jar" basedir="classes/app" excludes="*.properties">
        <manifest> 
            <attribute name="Main-Class" value="path.to.my.MainClass" />
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </jar>
</target>

Пример файла MANIFEST.MF, созданного задачей Ant:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_29-b11 (Sun Microsystems Inc.)
Main-Class: path.to.my.MainClass
Class-Path: Filters.jar RXTXcomm.jar collections-generic-4.01.jar colt
 -1.2.0.jar commons-codec-1.5.jar commons-io-2.0.1.jar commons-validat
 or-1.3.1.jar concurrent-1.3.4.jar forms-1.3.0.jar gdal.jar geotiff-ja
 i.jar jai_imageio-1.1.jar jakarta-oro-2.0.1.jar java-image-scaling-0.
 8.5.jar jcommander-1.7.jar jgroups-2.12.1.Final.jar jna.jar jung-algo
 rithms-2.0.1.jar jung-api-2.0.1.jar jung-graph-impl-2.0.1.jar jung-vi
 sualization-2.0.1.jar nimrodlf-1.2.jar platform.jar stax-api-1.0.1.ja
 r swingx-beaninfo-1.6.2.jar swingx-core-1.6.2.jar vecmath-1.3.1.jar v
 lcj-1.2.0.jar wstx-asl-3.2.6.jar

Как вы можете видеть, все внешние библиотеки jar, перечисленные в Class-Path, следуют за точным именем jar, которое будет использовать основное приложение. Все они должны иметь тот же путь к файлу, что и путь к файлу jar основного приложения. Класс основного приложения (обычно с методом main ()) будет вызываться из Main-Class файла MANIFEST.MF, и его jar не должен быть включен в Class-Path. Если все в порядке, банка будет работать.

Не беспокойтесь о странном форматировании MANIFEST.MF; оно генерируется в текстовом стиле из 80 столбцов заданием Ant.

...