it-swarm.com.ru

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

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

90
ultraman

Вы можете использовать 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, которая создает каталог распространения и копирует любые артефакты, которые необходимо напрямую защитить WARR:

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

94
David Citron

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

37
Mech Software

Мы используем 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>
22
mikek

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

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

http://Java.Sun.com/j2ee/tutorial/1_3-fcs/doc/WebComponents3.html

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

http://Java.Sun.com/products/servlet/download.html

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

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

14
boxofrats

Если вы не знаете, что делать и начинаете с нуля, 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. Но я думаю, что если вы только начинаете, изучение соглашений является хорошей идеей, прежде чем вы начнете делать свои собственные. Там нет ничего, чтобы помешать вам изменить/рефакторинг на ваш собственный предпочтительный метод на более позднем этапе.

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

12
Pablojim
4
Ilya Boyandin

Используйте код сборки муравья Я использую это для моего проекта 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>

3
sms

Другим распространенным вариантом является gradle. 

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

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

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

apply plugin: 'war'

Затем:

./gradlew war

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

2
Charlie Dalsass

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

ШАГИ:

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

  2. Перейдите и создайте новый архив в верхней директории "Project Archives". У вас есть только опция jar, но имя вашего архива * .war.

  3. Сконфигурируйте набор-файлов, то есть какие файлы нужно включить. Типичным является настройка двух наборов файлов, аналогичных настройке сборки веб-развертывания (свойство проекта).

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

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

2
arpadf

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

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

jar -cvf projectname.war *

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

1
XChikuX

Упрощенный код оболочки для создания файлов 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
0
Joe Horvath

Более простое решение, которое также обновляет рабочее пространство 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>
0
Alex R