Maven 是怎样创建War 包

Maven 是怎样创建War 包,第1张

转载 最近在网上看到一篇介绍maven基础知识的文章,觉得对初学Maven的朋友一定有帮助。水平有限,翻译的不好,请大家见谅。

介绍

在处理WEB应用的时候,最终使用的工程文件是以War包的形式交付。Maven编译系统可以轻松的创建War包。接下来就让我们看看Maven是如何把一个源文件的工程转换成War包的。

Maven 版本 Apache Maven 3.0.4

工程实例

让我们来看看这个非常典型的Maven化的WEB工程

对应的POM.xml如下:

我们用此命令War包

1mvn package

War生成在根目录下

1/target/myprojectname.war

如下图,概况Maven生成War包过程

Maven 默认配置

我们都知道Maven可以很容易的把源文件工程创建为War包,但是POM文件中什么也没有设置。这是怎么回事啊?实际上Maven有自己默认的设置。这称之为 “convention over configuration”,Maven在配置中提供默认值。

第一,因为有一些Maven插件本身就与Maven 的生命周期绑定在一起。例如,在编译阶段使用

compiler:compile 作为默认命令。这就意味着当执行到编译阶段compiler plugin 被调用执行。如果选择生成WAR,那么 war:war 会与这个阶段绑定。

第二,当没有明确设置参数的时候,插件都会有自己默认值。例如 compiler:compile 目标有个参数是 compilerId。当默认值是 javac就意味着JDK 会被使用。当需要生成其他形式时可以重写此配置。

第三,一些设置包含在 Super POM,此文件是POM文件默认继承的。从Mavne3 起 Super POM 被放在

1maven_dir/lib/maven-model-builder-3.0.3.jar:org/apache/maven/model/pom-4.0.0.xml

在这里我们可以发现很多默认的配置信息

Maven 生命周期

在我们的工程中,当执行 mvn package 命令,maven会执行它整个生命周期中的六个阶段

1process-resources, compile, process-test-resources, test-compile, test and package

每个阶段会包含一个或多个目标。Maven 插件提供目标:一个插件可以有一个或多个目标。例如

Compiler 插件有两个目标:compiler:compile 和 compiler:testCompile

我们可以使用 mvn help:describe -Dcmd=phasename 命令列出如下内容

下面让我们看看每个目标

1.resources:resources

此目标用来将资源文件夹下的内容拷贝到输出目录

2.compiler:compile

此目标编译源项目工程

3.resources:testResources

此目标拷贝测试资源到测试输出目录

4.compiler:testCompile

此目标编译测试项目

5.surefire:test

此目标执行工程的单元测试,编译的测试类放在 /target/test-classes

6.war:war

此目录创建War包。它会把所有需要的文件放在

1/target/myprojectname/

而后将他们打包生成 **.war。其中一个步骤是将 /src/main/webapp/ 拷贝到输出目录。

War插件另外一个重要步骤是拷贝Class文件到到 WEB-INF/classes目录和项目所依赖的jar包到 WEB-INF/lib目录。

默认情况下,插件还包含两个Maven描述文件:

META-INF/maven/${groupId}/${artifactId}/pom.xml

pom.properties 文件,META-INF/maven/${groupId}/${artifactId}/pom.properties

1#Generated by Maven

2#Sat May 12 00:50:42 CEST 2012

3version=1.0-SNAPSHOT

4groupId=mygroup.com

5artifactId=myprojectname

最终的War包放在/target/目录下。

项目依赖

pom.xml文件会有一个默认的(JUnit)依赖。我们可以加另外一个常用的Jar log4j。

1

2log4j

3log4j

41.2.16

5

当没有设置依赖范围 ( scope),默认为 compile scope。这就意味着此依赖在编译、测试、运行阶段都可以得到。

只要是运行中会用到的jar包,都会拷贝到 /WEB-INF/lib目录

转载

第一个,我建议你直接修改pom.xml文件,因为你都是在Eclipse里面 *** 作,

在<dependencies>标签里面添加:

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

</dependency>

这里已log4j给你举例参考。检查本地类仓库根目录:

groupId\artifactId\version\ 下面是否有你需要引入的包。

以上log4j的相对目录为:

\log4j\log4j\1.2.17\

第二个,你的配置应该是没有问题的。

你把打包的替换为最简单的这样试试,先clean一下,再build一下工程后,install

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

<version>2.4</version>

<configuration>

<warName>${project.artifactId}</warName>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.3.1</version>

<configuration>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

</plugins>

</build>

在对应的pom文件中,找到packing这个属性,改为war

如果没有,就自己加一个,这个是有默认值的,默认为jar。例如:

<modelVersion>4.0.0</modelVersion>

<groupId>com.xxx.yyy</groupId>

<artifactId>test-war</artifactId>

<packaging>war</packaging>

<version>1.0</version>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11577103.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存