Как установить другой путь в build.xml

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

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

Пожалуйста, помогите мне, как я могу установить этот внешний каталог в пути к классам 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.RELEASE Основной класс: myProject.MainApp


person Amit    schedule 10.02.2012    source источник
comment
Вы имеете в виду файл build.xml задачи Ant? Вы имеете в виду путь, как в пути к классам?   -  person ee.    schedule 10.02.2012
comment
@ее да. Я использую сборку Ant для запуска.   -  person Amit    schedule 10.02.2012
comment
Вы имеете в виду, что хотите добавить некоторые задачи муравья во внешний набор банок?   -  person Guillaume Polet    schedule 10.02.2012
comment
Проблема в том, что база проекта Ant определяется его свойством basedir, которое указывается следующим образом: the base directory from which all path calculations are done. This attribute might be overridden by setting the "basedir" property beforehand. When this is done, it must be omitted in the project tag. If neither the attribute nor the property have been set, the parent directory of the buildfile will be used. ant. apache.org/manual/using.html По сути, это означает, что проект Ant всегда связан с расположением файла build.xml или с его базовым свойством...   -  person ee.    schedule 10.02.2012
comment
Возможно, настроив атрибут relative=false в элементе Ant, можно переопределить это поведение относительного пути, чтобы он стал абсолютным путем... Но я не уверен... Возможно, вам потребуется проверить документацию Ant о том, где можно найти атрибут relative в какой элемент муравья...   -  person ee.    schedule 10.02.2012
comment
Возможно, вы также можете обратиться к объяснению, данному свойства">stackoverflow.com/questions/5066872/   -  person ee.    schedule 10.02.2012
comment
Другое возможное решение: stackoverflow.com/questions/3733029/   -  person ee.    schedule 10.02.2012
comment
@ee relative=false родительского тега   -  person Amit    schedule 10.02.2012
comment
Я бы предложил опубликовать ваш build.xml и точное сообщение об ошибке, которое вы получите.   -  person Nikem    schedule 10.02.2012
comment
@Nikem: см. приведенный выше код / ​​Если у вас есть идеи о том, как я могу установить external_library для своего проекта, используя этот код. Пожалуйста, дайте мне несколько предложений.   -  person Amit    schedule 13.02.2012
comment
@GuillaumePolet: Нет, у меня такой же проект. и хочу использовать внешние банки в моей исполняемой банке. Итак, как я могу указать внешний путь?   -  person Amit    schedule 13.02.2012


Ответы (2)


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

<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()) будет вызываться из основного класса файла MANIFEST.MF, и его jar не должен быть включен в путь к классу. Если все правильно, банку можно будет запускать.

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

person ee.    schedule 10.02.2012
comment
Спасибо @ee, это хорошие предложения, но все же ошибки случаются, мой текущий каталог - C:/projects/, и я хочу указать путь D:/ext_jars для jar-файлов, я использовал фрагменты вашего кода, но все же эта ошибка появляется - person Amit; 10.02.2012
comment
Приведенный выше фрагмент целевого объекта Ant, который я предоставил, предполагает, что вы должны изменить что-то вроде указания фактического значения пути вашего основного класса, которое будет помечено для свойства Main-Class в файле манифеста (не path.to.my.MainClass< /б>!). Если вы не измените его, он не будет работать. Я проверил ваш build.xml, который вы недавно включили, но почему вы устанавливаете значения как ${Main-Class} и ${Class-Path} для своего элемента ‹jar›? Как вы их определяете? - person ecle; 10.02.2012
comment
@eee: я упомянул ${Main-Class} и ${Class-Path} в manifest.mf, поэтому я использовал его. - person Amit; 13.02.2012
comment
@Amit Хм, обычно я позволяю задаче Ant сгенерировать файл MANIFEST.MF для включения в банку во время ‹jar› на основе некоторых переменных свойств, созданных в самой задаче Ant, как вы можете видеть в моем посте, а не наоборот . - person ee.; 13.02.2012
comment
@Amit Можете ли вы опубликовать MANIFEST.MF, который вы использовали? Поскольку что-либо неправильное в этом файле не позволит запустить банку. - person ee.; 13.02.2012
comment
@Amit Извините, что я слишком поздно упоминаю об этом, но я также должен попросить вас перечислить все внешние библиотеки jar, которые вы фактически используете для своего приложения. Я заметил имена библиотек springframework в MANIFEST.MF, но все они неверны, поскольку в них отсутствует расширение .jar. Вы должны увидеть сгенерированный файл MANIFEST.MF в качестве ссылки. - person ee.; 13.02.2012
comment
@ee, в конце файла мне нужно написать путь к классу - d:/ext_jar/jar1.jar d:/ext_jar/jar2.jar вот так? - person Amit; 13.02.2012
comment
@Amit Нет, банки должны быть относительно пути запускаемой банки. В MANIFEST.MF не должно быть абсолютного пути. Опять же, вам не следует редактировать manifest.mf, если вы не знаете, как он работает; пусть задача Ant сделает это за вас. Но для того, чтобы все работало, то, как вы организуете файлы проекта Eclipse, очень важно для задачи Ant, особенно когда изменения вносятся между обоими. Я постараюсь найти ссылку на учебник по настройке проекта Eclipse, задачи Ant и задачи создания EXE в качестве бонуса... - person ecle; 13.02.2012
comment
@Amit Создать исполняемый файл и установить Windows на французском (используйте Google Translate для перевода ) - person ee.; 15.02.2012
comment
@ee ценит помощь ee большое спасибо - person Amit; 15.02.2012

Есть несколько способов возиться с путем к классам java, например, используя параметры командной строки пути к классам или редактируя переменную CLASSPATH, но в основном проблема, которую вы создаете для себя позже, заключается в том, что ваша сборка становится зависимой от определенной структуры каталогов.

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

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

Джефф

person Jeff    schedule 10.02.2012