전쟁 파일을 만드는 방법


96

바람둥이에서 실행하기 위해 전쟁 파일을 만드는 모범 사례 (Eclipse 사용)는 무엇입니까? 튜토리얼, 링크, 예제는 높이 평가됩니다.

답변:


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 파일을 클래스로 빌드하고 그 아래에 src있지만 런타임시 사용할 수 있어야 하는 비 Java 아티팩트 (예 : 속성, 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 빌드

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>

배포

마지막으로 Tomcat 배포 위치에 WAR을 직접 배포하는 작업을 설정할 수 있습니다.

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

클릭하고 가십시오!

이 모든 것이 설정되면 defaultEclipse 에서 대상을 실행하기 만하면 솔루션이 컴파일, WAR 및 배포됩니다.

이 접근 방식의 장점은 Eclipse 내에서뿐만 아니라 Eclipse 외부에서도 작동하고 프로젝트를 함께 작업하는 다른 개발자와 배포 전략 (예 : 소스 제어를 통해)을 쉽게 공유하는 데 사용할 수 있다는 것입니다.


음, 바람둥이에 배포하고 싶습니다. targer를 어떻게 변경해야합니까?

자세히 설명해 주시겠습니까? $ {tomcat.deploydir}이 Tomcat 컨텍스트 배포 디렉터리를 가리키는 한 그렇게해야합니다. 아니?
David Citron

1
전쟁 표적에는 불필요한 '<exclude name = "WEB-INF / **"/>'가 있습니다. * .class 파일을이 폴더에 생성했으며 제외해도 작동하지 않습니다. 작동하는 전쟁 대상에서이 제외 줄을 제거하십시오.
ankitjaininfo

2
이 대답은 불필요하게 복잡합니다.
Alex R

38

저는 항상 Eclipse에서 내보내기를 선택했습니다. war 파일을 빌드하고 필요한 모든 파일을 포함합니다. 프로젝트를 웹 프로젝트로 생성 한 것을 제공하기 만하면됩니다. Eclipse를 사용하면 매우 간단합니다.


감사! "파일"메뉴에서 "내보내기"를 선택한 다음 "내보내기 대상 선택"에서 "WAR"를 입력하면 war 파일 옵션이 나타납니다.
Brad Parks

4
빠르고 더러운 웹 앱을 선택했습니다. 테스트 WAR을 얻기 위해 개미 스크립트를 작성하는 것은 너무 많은 작업입니다.
Renan

ant 파일을 만드는 대신 또 다른 해결책은 WAR 파일로 래핑하려는 폴더로 이동하여 "jar -cvf name.war *"명령을 실행하는 것입니다.
MC

덕분에 Maven 또는 Ant를 구성하는 것보다 훨씬 간단합니다 (필요하지 않은 경우).
사이먼

23

우리는 모든 자바 프로젝트에 Maven (Ant의 빅 브라더)을 사용하며 매우 멋진 WAR 플러그인을 가지고 있습니다. 튜토리얼과 사용법은 거기에서 찾을 수 있습니다.

Ant보다 훨씬 쉽고 Eclipse와 완벽하게 호환되며 ( 이클립스 프로젝트를 만들려면 maven 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은 특정 버전의 "구성에 대한 관례"에 적합 할 경우 확실히 합리적인 선택입니다.
David Citron

1
나는 그것을 좋아합니다 =) 나는 꽤 큰 프로젝트에서 CM으로 일하고 있으며, 프로젝트 구성의 지저분한 작업을 해주셔서 감사합니다. 또한 플러그인 지원이 훌륭합니다. 5 분 안에 Surefire 및 CheckStyle을 사용하여 WAR 플러그인으로 다중 모듈 프로젝트를 실행하고 실행할 수 있다는 것은 대단한 일입니다. Ant는 더 개방적이고 틀림없이 더 강력하지만 비교하면 번거 롭습니다. 어쨌든 Maven은 Ant의 하위 집합이므로 스크립트를 작성해야하는 경우 환영합니다.
mikek

4
Maven의 XML 구조는 ANT를 기반으로하고 ANT는 Maven의 하위 집합으로 통합됩니다.
mikek

14

war 파일은 단순히 war 확장자가있는 jar 파일이지만 내용이 실제로 구조화되는 방식이 작동합니다.

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 파일"옵션을 사용하면 전쟁 파일을 저장할 수 있습니다.


12

무엇을해야할지 확실하지 않고 처음부터 시작하는 경우 Maven이 시작하는 데 도움을 줄 수 있습니다.

아래 단계를 따르면 Eclipse에서 새로운 전쟁 프로젝트 설정을 완벽하게 얻을 수 있습니다.

  1. Maven 다운로드 및 설치
  2. 명령 줄 실행 : mvn archetype:generate
  3. 프롬프트 된 단계를 따르십시오-간단한 Java 웹 프로젝트 (18) 및 적절한 이름 선택.
  4. 완료되면 다음을 실행하십시오. mvn eclipse:eclipse
  5. Eclipse를 시작하십시오. 파일-> 가져 오기-> 기존 프로젝트를 선택합니다. mvn 목표를 실행 한 디렉토리를 선택하십시오.
  6. 이제 Eclipse에서 전쟁 프로젝트를 아주 잘 시작해야합니다.
  7. mvn packageEclipse에서 서버를 설정하고 단순히 프로젝트를 서버에 추가하여 실행 하거나 배포 하여 전쟁 자체를 만들 수 있습니다 .

다른 사람들이 maven 사용의 단점은 maven 규칙을 사용해야한다는 것입니다. 하지만 막 시작하는 경우, 자신 만의 규칙을 만들기 전에 규칙을 배우는 것이 좋은 생각이라고 생각합니다. 나중에 선호하는 방법으로 변경 / 리팩토링하는 것을 막을 수는 없습니다.

도움이 되었기를 바랍니다.



3

내 프로젝트 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-s, 즉 포함 할 파일을 구성합니다. 일반적으로 웹 배포 어셈블리 (프로젝트 속성)가 구성되는 방식과 유사한 두 개의 파일 세트를 구성합니다.

    • / WebContent를 /에 복사
    • / build / classes를 WEB-INF / classes에 복사합니다 (아카이브에서 WEB-INF / classes 디렉토리를 정의한 후이 파일 세트를 작성하십시오).
  4. 일부 구성 파일을 배치 한 위치에 따라 파일 세트 제외 특성을 tweek해야 할 수도 있고 더 많은 파일 세트가 필요할 수도 있지만, 일단이를 구성하면 변경할 필요가 없다는 생각입니다.

  5. 아카이브를 수동으로 빌드하거나 서버에 직접 게시합니다. 이클립스에 의해 자동으로 빌드됩니다.



2

WEB-INF 폴더 외부에서 다음 명령을 사용하십시오. 이것은 전쟁 파일을 생성해야하며 내가 아는 가장 빠른 방법입니다.

(JDK 1.7 이상이 설치되고 JDK의 bin 디렉토리를 가리키는 환경 변수가 필요합니다.)

jar -cvf projectname.war *

참조 링크


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>

0

표준 Eclipse 동적 웹 프로젝트에서 WAR 파일을 작성하기위한 단순한 쉘 코드입니다. Linux 플랫폼에서 RAM 파일 시스템 (/ dev / shm)을 사용합니다.

#!/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

** 성배 웹 프로젝트의 Eclips Gaynemed에서 전쟁 파일 만들기 **

1. 프로젝트 가져 오기 :

2. datasource.groovy 파일 변경

다음과 같이 : url = "jdbc : postgresql : //18.247.120.101 : 8432 / PGMS"

2.chnge AppConfig.xml

3. Task Manager에서 Java를 종료합니다.

  1. 일식에서 깨끗한 명령을 실행하다

  2. 프로젝트 이름에 따라 'prod war'를 실행합니다.

  3. 로그 파일을 확인하고 동일한 날짜의 워크 벤치 디렉토리에서 동일한 .war 파일을 찾으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.