Помогите настроить среду сборки Java - PullRequest
3 голосов
/ 04 мая 2011

Я нахожусь в конце моего остроумия.Я трачу больше времени на то, чтобы заставить мою сборку работать, а не на разработку программного обеспечения.В настоящее время я работаю над крупномасштабным веб-приложением на Java на основе Tomcat 6.

В настоящее время база кода составляет около 25 тыс. LOC (хотя это не совсем характерно, поскольку некоторые из них автоматически генерируются для веб-служб - нодело в том, что он большой), и я работаю исключительно с eclipse, чтобы делать все, от отладки до управления путями и построения.В прошлом eclipse всегда было более чем достаточно, но я никогда не работал над таким большим проектом.

Первая проблема, с которой я столкнулся, - это когда я начал добавлять контент GWT.Это работало нормально, но процесс сборки был немного хакерским: мне пришлось вручную скомпилировать, а затем скопировать вывод js в соответствующий каталог, и отладка была кошмаром (я понимаю, что некоторые из этих проблем - просто GWT и способ его работы)..).Теперь проблема, с которой я сталкиваюсь - это попытка работать над проектом на компьютере с Windows (я работал на Mac и время от времени буду продолжать работать с Mac).Eclipse добавил библиотеки JVM для Mac OS в путь сборки, который, конечно, Windows не может найти.

Я задал вопрос о работе в двух разных средах , и большинство ответов касалось использования инструмента сборки, такого как Ant + Ivy или Maven.Я начал исследовать Maven и пытался заставить мой проект использовать его, но это просто одна головная боль за другой, и я даже не начал пытаться фактически выполнить / отладить мое приложение в Tomcat через eclipse.Самая неприятная часть всего этого - мне кажется, что эти инструменты сборки исключительно сложны (и, честно говоря, невероятно гибки), но, по крайней мере, на первый взгляд, усложняют жизнь, пока вы пытаетесь понять, какпросто скомпилируйте файл Java.

Итак, все это говорит, есть ли у кого-нибудь предложения о том, как упростить этот сценарий?Управление зависимостями было бы неплохо, но я не возражаю против поиска JAR-файлов самостоятельно.Самая важная вещь, которая мне нужна, - это что-то, что просто уйдет с моего пути и позволит мне работать над тем, над чем я на самом деле пытаюсь работать, а не тратить часы на отладку моих опечаток в файле XML, используемом системой сборки.

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 04 мая 2011

Я согласен. Вам не нужен Maven; тебе не нужна Айви. Начните с Ant.

Вот сравнительно общий Ant build.xml. Настройте его по своему желанию.

<?xml version="1.0" encoding="UTF-8"?>
<project name="xslt-converter" basedir="." default="package">

    <property name="version" value="1.6"/>
    <property name="haltonfailure" value="no"/>

    <property name="out" value="out"/>

    <property name="production.src" value="src"/>
    <property name="production.lib" value="lib"/>
    <property name="production.resources" value="config"/>
    <property name="production.classes" value="${out}/production/${ant.project.name}"/>

    <property name="test.src" value="test"/>
    <property name="test.lib" value="lib"/>
    <property name="test.resources" value="config"/>
    <property name="test.classes" value="${out}/test/${ant.project.name}"/>

    <property name="exploded" value="out/exploded/${ant.project.name}"/>
    <property name="exploded.classes" value="${exploded}/WEB-INF/classes"/>
    <property name="exploded.lib" value="${exploded}/WEB-INF/lib"/>

    <property name="reports.out" value="${out}/reports"/>
    <property name="junit.out" value="${reports.out}/junit"/>
    <property name="testng.out" value="${reports.out}/testng"/>

    <path id="production.class.path">
        <pathelement location="${production.classes}"/>
        <pathelement location="${production.resources}"/>
        <fileset dir="${production.lib}">
            <include name="**/*.jar"/>
            <exclude name="**/junit*.jar"/>
            <exclude name="**/*test*.jar"/>
        </fileset>
    </path>

    <path id="test.class.path">                            
        <path refid="production.class.path"/>
        <pathelement location="${test.classes}"/>
        <pathelement location="${test.resources}"/>
        <fileset dir="${test.lib}">
            <include name="**/junit*.jar"/>
            <include name="**/*test*.jar"/>
        </fileset>
    </path>

    <path id="testng.class.path">
        <fileset dir="${test.lib}">
            <include name="**/testng*.jar"/>
        </fileset>
    </path>

    <available file="${out}" property="outputExists"/>

    <target name="clean" description="remove all generated artifacts" if="outputExists">
        <delete dir="${out}" includeEmptyDirs="true"/>
        <delete dir="${reports.out}" includeEmptyDirs="true"/>
    </target>

    <target name="create" description="create the output directories" unless="outputExists">
        <mkdir dir="${production.classes}"/>
        <mkdir dir="${test.classes}"/>
        <mkdir dir="${reports.out}"/>
        <mkdir dir="${junit.out}"/>
        <mkdir dir="${testng.out}"/>
        <mkdir dir="${exploded.classes}"/>
        <mkdir dir="${exploded.lib}"/>
    </target>

    <target name="compile" description="compile all .java source files" depends="create">
        <!-- Debug output
                <property name="production.class.path" refid="production.class.path"/>
                <echo message="${production.class.path}"/>
        -->
        <javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}">
            <classpath refid="production.class.path"/>
            <include name="**/*.java"/>
            <exclude name="**/*Test.java"/>
        </javac>
        <javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}">
            <classpath refid="test.class.path"/>
            <include name="**/*Test.java"/>
        </javac>
    </target>

    <target name="junit-test" description="run all junit tests" depends="compile">
        <!-- Debug output
                <property name="test.class.path" refid="test.class.path"/>
                <echo message="${test.class.path}"/>
        -->
        <junit printsummary="yes" haltonfailure="${haltonfailure}">
            <classpath refid="test.class.path"/>
            <formatter type="xml"/>
            <batchtest fork="yes" todir="${junit.out}">
                <fileset dir="${test.src}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>
        <junitreport todir="${junit.out}">
            <fileset dir="${junit.out}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report todir="${junit.out}" format="frames"/>
        </junitreport>
    </target>

    <taskdef resource="testngtasks" classpathref="testng.class.path"/>
    <target name="testng-test" description="run all testng tests" depends="compile">
        <!-- Debug output
                <property name="test.class.path" refid="test.class.path"/>
                <echo message="${test.class.path}"/>
        -->
        <testng classpathref="test.class.path" outputDir="${testng.out}" haltOnFailure="${haltonfailure}" verbose="2" parallel="methods" threadcount="50">
            <classfileset dir="${out}/test/${ant.project.name}" includes="**/*.class"/>
        </testng>
    </target>

    <target name="exploded" description="create exploded deployment" depends="testng-test">
        <copy todir="${exploded.classes}">
            <fileset dir="${production.classes}"/>
        </copy>
        <copy todir="${exploded.lib}">
            <fileset dir="${production.lib}"/>
        </copy>
    </target>

    <target name="package" description="create package file" depends="exploded">
        <jar destfile="${out}/${ant.project.name}.jar" basedir="${production.classes}" includes="**/*.class"/>
    </target>

</project>
2 голосов
/ 04 мая 2011

Хотя на первый взгляд Maven может показаться немного сложным, я думаю, что это действительно очень хороший инструмент.да, у него есть свои бородавки, но в целом я думаю, что это один из лучших вариантов для Java.«вещь», которую вы действительно должны получить о Maven, - это то, что все основано на соглашении.если вы делаете все обычным способом maven, то ваш maven pom, как правило, очень маленький, и все «просто работает».и есть много информации для начала, чтобы показать вам, что такое «Maven Convention».(и да, вы обычно можете делать вещи по-своему, но обычно это того не стоит, если вы не застряли в существующем проекте, который было бы трудно реорганизовать).

1 голос
/ 04 мая 2011

Существуют альтернативы Ant / Ivy или Maven XML, которые могут стоить больших денег. Они используют настоящий язык программирования вместо XML DSL.

0 голосов
/ 04 мая 2011

Одно упрощение, которое вы можете использовать при работе исключительно в Eclipse, - позволить Eclipse позаботиться о компиляции. У данного проекта может быть свой собственный простой скрипт Ant, который упаковывает все, что нужно от bin в банку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...