Как создавать файлы войны

96

Каковы лучшие практики создания файлов войны (с использованием eclipse) для запуска на tomcat? руководства, ссылки, примеры высоко ценятся.


источник

Ответы:

98

Вы можете использовать Ant для настройки, компиляции, WAR и развертывания вашего решения.

<target name="default" depends="setup,compile,buildwar,deploy"></target>

Затем вы можете одним щелчком мыши выполнить в Eclipse эту цель Ant. Вот примеры каждого из шагов:

Предварительные условия

Мы предполагаем, что ваш код организован следующим образом:

  • ${basedir}/src: Файлы Java, свойства, файлы конфигурации XML
  • ${basedir}/web: Ваши файлы JSP
  • ${basedir}/web/lib: Любые JAR, необходимые во время выполнения
  • ${basedir}/web/META-INF: Ваш манифест
  • ${basedir}/web/WEB-INF: Ваши файлы web.xml

Настроить

Определите setupзадачу, которая создает каталог распространения и напрямую копирует любые артефакты, которые необходимо использовать WARred:

<target name="setup">
    <mkdir dir="dist" />
    <echo>Copying web into dist</echo>
    <copydir dest="dist/web" src="web" />
    <copydir dest="dist/web/WEB-INF/lib" src="${basedir}/../web/WEB-INF/lib" />
</target>

Компилировать

Соберите свои Java-файлы в классы и скопируйте любые артефакты, не относящиеся к Java, которые находятся внутри, srcно должны быть доступны во время выполнения (например, свойства, файлы XML и т. Д.):

<target name="compile">
    <delete dir="${dist.dir}/web/WEB-INF/classes" />
    <mkdir dir="${dist.dir}/web/WEB-INF/classes" />
    <javac destdir="${dist.dir}/web/WEB-INF/classes" srcdir="src">
        <classpath>
            <fileset dir="${basedir}/../web/WEB-INF/lib">
                  <include name="*" />
            </fileset>
        </classpath>
    </javac>
    <copy todir="${dist.dir}/web/WEB-INF/classes">
        <fileset dir="src">
            <include name="**/*.properties" />
            <include name="**/*.xml" />
        </fileset>
    </copy>
</target>

Построить WAR

Создайте саму ВОЙНУ:

<target name="buildwar">
    <war basedir="${basedir}/dist/web" destfile="My.war"
     webxml="${basedir}/dist/web/WEB-INF/web.xml">
        <exclude name="WEB-INF/**" />
        <webinf dir="${basedir}/dist/web/WEB-INF/">
            <include name="**/*.jar" />
        </webinf>
    </war>
</target>

Развернуть

Наконец, вы можете настроить задачу для развертывания WAR прямо в месте развертывания Tomcat:

<target name="deploy">
    <copy file="My.war" todir="${tomcat.deploydir}" />
</target>

Нажмите и вперед!

Как только все это настроено, простой запуск defaultцели из Eclipse скомпилирует WAR и развернет ваше решение.

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

Дэвид Ситрон
источник
ну, я хочу развернуть его на tomcat. Как мне изменить цель?
Не могли бы вы уточнить? Пока $ {tomcat.deploydir} указывает на ваш каталог развертывания контекста Tomcat, он должен это делать. Нет?
Дэвид Ситрон,
1
В цели войны нет ненужного '<exclude name = "WEB-INF / **" />'. Вы создали файлы * .class в этой папке, и их исключение не работает. Удалите эту строку исключения из цели войны, которую она работает.
ankitjaininfo
2
Этот ответ излишне сложен.
Alex R
38

Я всегда просто выбирал Экспорт из Eclipse. Он создает файл войны и включает все необходимые файлы. Если вы создали проект как веб-проект, это все, что вам нужно сделать. Eclipse делает это очень простым.

Программное обеспечение Mech
источник
Спасибо! и, чего бы это ни стоило, вы выбираете «Экспорт» в меню «Файл», затем в «Выбор места назначения экспорта» набираете «WAR», и появляется опция файла войны.
Брэд Паркс
4
мой выбор для быстрых и грязных веб-приложений. написать сценарий муравья только для того, чтобы получить тестовую WAR, - это слишком много работы.
Renan
другое решение вместо создания файла ant - перейти в папку, которую вы хотите обернуть в файл WAR, и выполнить эту команду «jar -cvf name.war *».
MC
Спасибо за это, НАМНОГО проще, чем настраивать Maven или Ant (когда это не обязательно).
Саймон
23

Мы используем Maven (старший брат Ant) для всех наших java-проектов, и у него есть очень изящный плагин WAR. Здесь можно найти учебные материалы и их использование.

Это намного проще, чем Ant, полностью совместим с Eclipse (используйте maven eclipse: eclipse для создания проектов Eclipse) и прост в настройке.

Домашняя страница Maven

Плагин Maven WAR

Пример конфигурации:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1-alpha-2</version>
    <configuration>
        <outputDirectory>${project.build.directory}/tmp/</outputDirectory>
        <workDirectory>${project.build.directory}/tmp/war/work</workDirectory>
        <webappDirectory>${project.build.webappDirectory}</webappDirectory>
        <cacheFile>${project.build.directory}/tmp/war/work/webapp-cache.xml</cacheFile>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
            <nonFilteredFileExtension>png</nonFilteredFileExtension>
            <nonFilteredFileExtension>gif</nonFilteredFileExtension>
            <nonFilteredFileExtension>jsp</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
        <webResources>
            <resource>
                <directory>src/main/webapp/</directory>
                <targetPath>WEB-INF</targetPath>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </webResources>
        <warName>Application</warName>
    </configuration>
</plugin>
Микек
источник
1
Я вернул вам вашу точку зрения (хотя это не я удалил). Maven, безусловно, является разумным выбором, если вы случайно (хотите?) Вписываетесь в их конкретную версию «соглашения важнее конфигурации».
Дэвид Ситрон,
1
Мне это нравится =) Я работаю CM над довольно большим проектом, и я ценю то, что за меня проделали черновую работу по настройке проекта. Также замечательная поддержка плагинов. Возможность запустить и запустить многомодульный проект с помощью WAR-плагина, Surefire и CheckStyle за пять минут - настоящее удовольствие. Ant, хотя и более открытый и, возможно, более мощный, по сравнению с ним создает проблемы. В любом случае Maven - это подмножество Ant, поэтому, если вам нужно выполнить там какие-либо сценарии, добро пожаловать.
mikek
4
Помимо структуры XML Maven, основанной на ANT, и ANT включен как подмножество Maven.
mikek
14

War-файл - это просто jar-файл с расширением war, но он работает именно так, как на самом деле структурировано содержимое.

Учебник J2EE / Java EE может стать началом:

http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/WebComponents3.html

И спецификация сервлета содержит кровавые детали:

http://java.sun.com/products/servlet/download.html

Если вы создаете новый веб-проект в Eclipse (я имею в виду версию Java EE), структура создается для вас, и вы также можете указать ей, где установлен ваш сервер приложений, и он развернет и запустит приложение за вас.

Использование опции «Экспорт-> WAR-файл» позволит вам сохранить военный файл.

Boxofrats
источник
12

Если вы не знаете, что делать, и начинаете с нуля, Maven поможет вам начать работу.

Выполнив следующие шаги, вы можете идеально настроить новый военный проект в eclipse.

  1. Скачайте и установите Maven
  2. Заходим в командную строку: mvn archetype:generate
  3. Следуйте подсказкам - выберите простой веб-проект java (18) и подходящее имя.
  4. Когда он закончится, запустите: mvn eclipse:eclipse
  5. Запустите Eclipse. Выберите Файл -> Импорт -> Существующий проект. Выберите каталог, в котором вы запускали цели mvn.
  6. Вот и все, теперь у вас должно быть очень хорошее начало военного проекта в Eclipse.
  7. Вы можете создать саму войну, запустив mvn packageили развернув ее, настроив сервер в eclipse и просто добавив проект на сервер.

Как говорили некоторые другие, обратная сторона использования maven заключается в том, что вы должны использовать соглашения maven. Но я думаю, что если вы только начинаете, изучение условных обозначений - хорошая идея, прежде чем вы начнете создавать свои собственные. Ничто не помешает вам изменить / провести рефакторинг на ваш собственный предпочтительный метод позже.

Надеюсь это поможет.

Паблоджим
источник
3

Используйте код сборки ant, который я использую для своего проекта SMS

<property name="WEB-INF" value="${basedir}/WebRoot/WEB-INF" />
<property name="OUT" value="${basedir}/out" />
<property name="WAR_FILE_NAME" value="mywebapplication.war" />
<property name="TEMP" value="${basedir}/temp" />

<target name="help">
    <echo>
        --------------------------------------------------
        compile - Compile
        archive - Generate WAR file
        --------------------------------------------------
    </echo>
</target>

<target name="init">
    <delete dir="${WEB-INF}/classes" />
    <mkdir dir="${WEB-INF}/classes" />
</target>

<target name="compile" depends="init">
    <javac srcdir="${basedir}/src" 
                destdir="${WEB-INF}/classes" 
                classpathref="libs">
    </javac>
</target>

<target name="archive" depends="compile">
    <delete dir="${OUT}" />
    <mkdir dir="${OUT}" />
    <delete dir="${TEMP}" />
    <mkdir dir="${TEMP}" />
    <copy todir="${TEMP}" >
        <fileset dir="${basedir}/WebRoot">
        </fileset>
    </copy>
    <move file="${TEMP}/log4j.properties" 
                    todir="${TEMP}/WEB-INF/classes" />
    <war destfile="${OUT}/${WAR_FILE_NAME}" 
                    basedir="${TEMP}" 
                    compress="true" 
                    webxml="${TEMP}/WEB-INF/web.xml" />
    <delete dir="${TEMP}" />
</target>

<path id="libs">
    <fileset includes="*.jar" dir="${WEB-INF}/lib" />
</path>

смс
источник
2

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

ШАГИ:

  1. Включить поддержку «Архивов проектов»; это может зависеть от вашего проекта (я использовал его в проекте Java EE / Web). Щелкните правой кнопкой мыши корневой каталог проекта; Настроить -> Добавить поддержку архивов проектов.

  2. Идите и создайте новый архив в верхнем каталоге «Архивы проекта». У вас есть только опция jar, но вы называете архив * .war.

  3. Настройте Fileset-ы, то есть какие файлы должны быть включены. Обычно настраиваются два набора файлов аналогично настройке сборки веб-развертывания (свойство проекта).

    • скопировать / WebContent в /
    • скопируйте / build / classes в WEB-INF / classes (создайте этот набор файлов после того, как определите каталог WEB-INF / classes в архиве)
  4. Возможно, вам потребуется настроить свойство exclude набора файлов в зависимости от того, где вы разместили некоторые из файлов конфигурации, или вам может потребоваться больше наборов файлов, но идея состоит в том, что после настройки этого параметра вам не нужно его изменять.

  5. Собрать архив вручную или опубликовать прямо на сервере; но также автоматически создается для вас Eclipse

arpadf
источник
2

Другой распространенный вариант - gradle.

http://www.gradle.org/docs/current/userguide/application_plugin.html

Чтобы создать файл войны в веб-приложении:

В build.gradle добавьте:

apply plugin: 'war'

Затем:

./gradlew war

Используйте макет из принятого ответа выше.

Чарли Далсасс
источник
2

Используйте следующую команду вне папки WEB-INF. Это должно создать ваш файл войны, и это самый быстрый способ, который я знаю.

(Вам потребуется установленный JDK 1.7+ и переменные среды, указывающие на каталог bin вашего JDK.)

jar -cvf projectname.war *

Ссылка Ссылка

XChikuX
источник
0

Более простое решение, которое также обновляет рабочее пространство Eclipse:

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="default">    
    <target name="default">
        <war destfile="target/MyApplication.war" webxml="web/WEB-INF/web.xml">
            <fileset dir="src/main/java" />
            <fileset dir="web/WEB-INF/views" />
            <lib dir="web/WEB-INF/lib"/>
            <classes dir="target/classes" />
        </war>
        <eclipse.refreshLocal resource="MyApplication/target" depth="infinite"/>
    </target>
</project>
Alex R
источник
0

Упрощенный код оболочки для создания файлов WAR из стандартного динамического веб-проекта Eclipse. Использует файловую систему RAM (/ dev / shm) на платформе Linux.

#!/bin/sh

UTILITY=$(basename $0)

if [ -z "$1" ] ; then
    echo "usage: $UTILITY [-s] <web-app-directory>..."
    echo "       -s ..... With source"
    exit 1
fi

if [ "$1" == "-s" ] ; then
    WITH_SOURCE=1
    shift
fi

while [ ! -z "$1" ] ; do
    WEB_APP_DIR=$1

    shift

    if [ ! -d $WEB_APP_DIR ] ; then
        echo "\"$WEB_APP_DIR\" is not a directory"
        continue
    fi

    if [ ! -d $WEB_APP_DIR/WebContent ] ; then
        echo "\"$WEB_APP_DIR\" is not a Web Application directory"
        continue
    fi

    TMP_DIR=/dev/shm/${WEB_APP_DIR}.$$.tmp
    WAR_FILE=/dev/shm/${WEB_APP_DIR}.war

    mkdir $TMP_DIR

    pushd $WEB_APP_DIR > /dev/null
    cp -r WebContent/* $TMP_DIR
    cp -r build/* $TMP_DIR/WEB-INF
    [ ! -z "$WITH_SOURCE" ] && cp -r src/* $TMP_DIR/WEB-INF/classes
    cd $TMP_DIR > /dev/null
    [ -e $WAR_FILE ] && rm -f $WAR_FILE
    jar cf $WAR_FILE .
    ls -lsF $WAR_FILE
    popd > /dev/null

    rm -rf $TMP_DIR
done
Джо Хорват
источник
-3

** Создание файла War в Eclips Gaynemed веб-проекта grails **

1. Импорт проекта:

2.Измените файл datasource.groovy.

Как это: url = "jdbc: postgresql: //18.247.120.101: 8432 / PGMS"

2. изменить AppConfig.xml

3. убить Java из диспетчера задач:

  1. запустить чистую команду в eclips

  2. запустите 'prod war' по названию проекта.

  3. Проверьте файл журнала и найдите тот же файл .war в каталоге рабочей среды с той же датой.

Ратнеш Кумар
источник