如何创建战争文件

Posted

技术标签:

【中文标题】如何创建战争文件【英文标题】:How to create war files 【发布时间】:2010-11-03 08:32:29 【问题描述】:

创建war文件(使用eclipse)以在tomcat上运行的最佳实践是什么?教程,链接,示例非常感谢。

【问题讨论】:

【参考方案1】:

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

(您需要安装 JDK 1.7+ 和指向 JDK 的 bin 目录的环境变量。)

jar -cvf projectname.war *

Reference Link

【讨论】:

如果您收到'jar' is not recognized as an internal or external command,请尝试"%JAVA_HOME%\bin\jar" -cvf projectname.war *【参考方案2】:

另一个常见的选项是 gradle。

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

在网络应用程序中构建您的战争文件:

在 build.gradle 中,添加:

apply plugin: 'war'

然后:

./gradlew war

使用上面接受的答案中的布局。

【讨论】:

【参考方案3】:

用于从标准 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

【讨论】:

【参考方案4】:

更简单的解决方案也刷新了 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>

【讨论】:

【参考方案5】:

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

1.导入项目:

2.修改datasource.groovy文件

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

2.chnge AppConfig.xml

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

    在 eclips 中运行 clean 命令

    按照项目名称运行“prod war”。

    查看日志文件,在workbench目录下找到相同日期的.war文件。

【讨论】:

糟糕。这可能来自他们的团队笔记。【参考方案6】:

我们所有的 java 项目都使用 Maven(Ant 的老大哥),它有一个非常漂亮的 WAR 插件。可以在那里找到教程和用法。

它比 Ant 简单很多,完全兼容 Eclipse(使用 maven eclipse:eclipse 创建 Eclipse 项目)并且易于配置。

Maven's homepage

Maven WAR plugin

示例配置:

<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>

【讨论】:

我已经回复了你的观点(虽然不是我删除了它)。如果您碰巧(想要?)符合他们特定版本的“约定优于配置”,那么 Maven 无疑是一个合理的选择。 我碰巧喜欢它 =) 我在一个相当大的项目中担任 CM,我很高兴为我完成了项目配置的繁重工作。此外,插件支持很棒。能够使用 WAR 插件、Surefire 和 CheckStyle 在五分钟内启动并运行一个多模块项目是一种享受。蚂蚁虽然更开放,可以说更强大,但相比之下就麻烦了。无论如何,Maven 是 Ant 的一个子集,所以如果您需要在那里编写任何脚本,欢迎您。 除了 Maven 的 XML 结构是基于 ANT 的,并且 ANT 被合并为 Maven 的子集。【参考方案7】:

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

按照以下步骤,您可以在eclipse中完美地设置一个新的war项目。

    下载安装Maven 进入命令行运行:mvn archetype:generate 按照提示的步骤 - 选择简单的 java web 项目 (18) 和合适的名称。 当它完成运行时:mvn eclipse:eclipse 启动 Eclipse。选择文件 -> 导入 -> 现有项目。选择您运行 mvn 目标的目录。 就是这样,您现在应该在 Eclipse 中开始一个战争项目 您可以通过运行 mvn package 来创建战争本身,或者通过在 eclipse 中设置服务器并将项目添加到服务器来部署它。

正如其他人所说,使用 maven 的缺点是您必须使用 maven 约定。但我认为,如果您刚刚开始,在开始自己制作之前学习约定是一个好主意。没有什么可以阻止您稍后更改/重构为自己喜欢的方法。

希望这会有所帮助。

【讨论】:

【参考方案8】:

另一种选择是使用 Eclipse 自动构建它。当然如果你有持续集成环境推荐使用 Ant 或 Maven。导出选项不是很方便,因为您必须每次都配置导出属性。

步骤:

    启用“项目档案”支持;这可能取决于您的项目(我在 Java EE/Web 项目中使用它)。右键项目根目录;配置 -> 添加项目档案支持。

    在“项目档案”***目录中创建一个新档案。您只有 jar 选项,但将存档命名为 *.war。

    配置 Fileset-s,即要包含哪些文件。典型的是配置两个文件集,类似于配置 Web 部署程序集(项目属性)的方式。

    将 /WebContent 复制到 / 将 /build/classes 复制到 WEB-INF/classes(在存档中定义 WEB-INF/classes 目录后创建此文件集) 1234563 /p>

    手动构建存档或直接发布到服务器;但也会由 Eclipse 自动为您构建

【讨论】:

【参考方案9】:

使用Ant war task

【讨论】:

【参考方案10】:

您可以使用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 本身:

<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>

点击即可!

设置完所有这些后,只需从 Eclipse 启动 default 目标即可编译、WAR 并部署您的解决方案。

这种方法的优点是它可以在 Eclipse 之外以及在 Eclipse 内部工作,并且可以用来与其他正在处理您的项目的开发人员轻松地共享您的部署策略(例如通过源代码控制)。

【讨论】:

嗯,我想把它部署到tomcat。我应该如何更改目标? 您能详细说明一下吗?只要 $tomcat.deploydir 指向您的 Tomcat 上下文部署目录,就应该这样做。没有? 在战争目标中有不必要的''。您已在此文件夹中生成 *.class 文件,但排除它们不起作用。从它起作用的战争目标中删除此排除行。 这个答案太复杂了。【参考方案11】:

使用 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>

【讨论】:

【参考方案12】:

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 文件。

【讨论】:

【参考方案13】:

我总是选择从 Eclipse 导出。它构建战争文件并包含所有必要的文件。假设您将项目创建为 Web 项目,这就是您需要做的所有事情。 Eclipse 让它变得非常简单。

【讨论】:

谢谢!值得一提的是,您从“文件”菜单中选择“导出”,然后在“选择导出目标”中键入“WAR”,然后会出现战争文件选项。 我选择快速和肮脏的网络应用程序。编写一个 ant 脚本只是为了得到一个测试 WAR 实在是太辛苦了。 另一种解决方案不是创建 ant 文件,而是转到您要包装在 WAR 文件中的文件夹并执行此命令“jar -cvf name.war *”。 感谢您,这比配置 Maven 或 Ant 简单得多(当不需要时)。

以上是关于如何创建战争文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?

创建没有版本号的 grails 战争

创建 webapp 战争发布“行家之道”

如何在创建战争时更改 Gradle 中 .properties 的内容

如何在 WildFly 10 中将爆炸战争部署为文件夹

为啥 Play Framework 战争包含重复的类文件?