@raner134

NoClassDefFoundError. Как правильно подключать сторонние библиотеке в Ant?

Не могу подключить библиотеку при запуске через ant. Что интересно, данная библиотека компилируется с задачей, которая отвечает за тест.
Сам build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="Calculator" basedir="." default="run">

    <property name="src.dir"  value="./src"/>
    <property name="build.dir" value="./classes"/>
    <property name="classes.dir" value="./classes"/>
    <property name="jar.dir"   value="${build.dir}/jar"/>
    <property name="client-class"  value="com.test.calc.Client"/>
    <property name="server-class" value="com.test.calc.Server"/>
    <property name="junit" value="lib/junit-4.12.jar"/>

    <property name="lib.dir"  value="${basedir}/lib"/>


    <path id="classpath">
        <fileset dir="lib">
            <include name="**/*.jar" />
        </fileset>
    </path>


    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile" depends="clean">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false">
        </javac>
        <mkdir dir="${classes.dir}/lib"/>

        <copy todir="${classes.dir}/lib">
            <fileset dir="${lib.dir}">
                <include name="**/*.jar"/>
            </fileset>
        </copy>
    </target>

    <target name="build" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/Client.jar" basedir="${classes.dir}">
                <manifest>
            <attribute name="Main-Class" value="${client-class}"/>
        </manifest>
        </jar>

        <jar destfile="${jar.dir}/Server.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${server-class}"/>
            </manifest>
        </jar>
    </target>


    <target name="run" depends="build">
        <parallel>
            <java jar="${jar.dir}/Server.jar" fork="true" classpath="classpath">

            </java>

            <!--<waitfor maxwait="5" maxwaitunit="second" timeoutproperty="failtimeout">-->
                <!--<socket server="localhost" port="8189"/>-->
            <!--</waitfor>-->

        <java jar="${jar.dir}/Client.jar" fork="true" classpath="classpath">


        </java>

    </parallel>
    </target>


    <target name="test" depends="compile">
        <junit printsummary="on" fork="true" showoutput="true">
            <classpath>
                <pathelement location="${classes.dir}"/>
                <pathelement location="lib/junit-4.12.jar"/>
                <pathelement location="lib/hamcrest-core-1.3.jar"/>
                <pathelement location="lib/MathParser.org-mXparser-4.1.1.jar"/>
            </classpath>
            <formatter type="brief" usefile="false"/>
            <test name="test_class.CalculatorTest"/>
        </junit>
    </target>

</project>
  • Вопрос задан
  • 397 просмотров
Пригласить эксперта
Ответы на вопрос 1
zolt85
@zolt85
Программист
Ну чтож, продолжим, молодой человек.
Совет номер раз - в property, которые указывают на пути к файлам лучше сразу использовать location вместо value.
Т.е.
<property name="classes.dir" location="./classes"/>


Еще было бы не плохо рассказать нам, какой версией Ant Вы пользуетесь.

Теперь по поводу запуска теста, на таргете test висит зависимость от таргета compile, но если посмотреть в таргет compile, то можно увидеть, что ничего кроме компиляции там не происходит (это я намекаю на то, что jar там не создается), а сборка скомпилированных классов в jar происходит в таргете build. По-этому, запись таргета test надо привести к виду
<target name="test" depends="build">
...
</target>

Таким образом, у Вас запустится сначала компиляция Вашего кода, затем все соберется в jar-ы, а уже потом запустится тест
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы