如何创建战争文件


96

创建战争文件(使用eclipse)以在tomcat上运行的最佳实践是什么?教程,链接,示例受到高度赞赏。

Answers:


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任务,该任务创建分发目录并复制需要直接警告的所有工件:

<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本身:

<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上下文部署目录,就应该执行此操作。没有?
David Citron

1
在战争目标中,没有必要使用'<exclude name =“ WEB-INF / **” />'。您已经将* .class文件生成到此文件夹中,并且将它们排除在外是行不通的。从有效的战争目标中删除此排除行。
ankitjaininfo

2
这个答案不必要地复杂。
Alex R

38

我一直只是选择从Eclipse导出。它生成war文件并包括所有必需的文件。为您提供了将项目创建为Web项目所需的全部操作。Eclipse使它变得非常简单。


谢谢!然后,从“文件”菜单中选择“导出”,然后在“选择导出目标”中键入“ WAR”,然后出现战争文件选项。
布莱德·帕克斯

4
快速和肮脏的Web应用程序的我的选择。编写一个蚂蚁脚本只是为了进行测试战争,这是太多的工作。
雷南

除了创建ant文件以外,另一种解决方案是转到要包装在WAR文件中的文件夹,然后执行此命令“ jar -cvf name.war *”。
MC

为此,比配置Maven或Ant(不需要时)要简单得多。
simon

23

我们在所有Java项目中都使用Maven(Ant的大哥哥),它具有一个非常漂亮的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当然是一个合理的选择。
David Citron

1
我碰巧喜欢它=)我正在作为一个大型项目的CM工作,我感谢为我完成项目配置的艰巨工作。另外,插件支持也很棒。能够在五分钟之内通过Surefire和CheckStyle启用带有WAR插件的多模块项目并运行。相比之下,蚂蚁虽然更开放,而且功能更强大,但是却很麻烦。无论如何,Maven是Ant的一个子集,因此,如果您需要在其中进行任何脚本编写,都欢迎您。
mikek

4
除了Maven的XML结构是基于ANT的,而且ANT被合并为Maven的子集之后。
mikek 2012年

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中创建一个新的Web项目(我指的是Java EE版本),则将为您创建该结构,还可以告诉该结构您的Appserver的安装位置,它将为您部署并启动该应用程序。

使用“导出-> WAR文件”选项将使您保存war文件。


12

如果您不确定该怎么做并且从头开始,那么Maven可以帮助您入门。

通过执行以下步骤,您可以在Eclipse中完美地完成新的战争项目设置。

  1. 下载并安装Maven
  2. 转到命令行运行: mvn archetype:generate
  3. 按照提示的步骤操作-选择简单的Java Web项目(18)和合适的名称。
  4. 完成后,请运行: mvn eclipse:eclipse
  5. 启动Eclipse。选择文件->导入->现有项目。选择运行mvn目标的目录。
  6. 就是这样,您现在应该在蚀战项目上有一个很好的开始
  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. 配置文件集,即要包含的文件。典型的是配置两个文件集,类似于Web部署程序集(项目属性)的配置方式。

    • 将/ WebContent复制到/
    • 将/ build / classes复制到WEB-INF / classes(在归档文件中定义WEB-INF / classes目录后创建此文件集)
  4. 您可能需要将文件集的exclude属性设置为tweek,这取决于放置一些配置文件的位置,或者您可能需要更多的文件集,但其想法是,一旦配置了此文件,就无需更改它。

  5. 手动建立档案或直接发布到服务器;但是Eclipse也会自动为您构建



2

在WEB-INF文件夹外使用以下命令。这应该创建您的war文件,这是我所知道的最快的方法。

(您将需要安装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动态Web项目创建WAR文件的简单Shell代码。在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

**在Grails Web项目的Eclips Gaynemed中制作战争文件**

1.导入项目:

2.更改datasource.groovy文件

像这样:url =“ jdbc:postgresql://18.247.120.101:8432 / PGMS”

2.chnge AppConfig.xml

3.从任务管理器中杀死Java:

  1. 在日食中运行干净的命令

  2. 运行项目名称后面的“ prod war”。

  3. 检查日志文件,并在具有相同日期的工作台目录中找到相同的.war文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.