Maven程序集插件会生成不可部署的war文件
我正在使用Spring,Hibernate,GWT和Maven 3开发一个多模块项目,并尝试将一个war文件分发部署到一个servlet容器(最好是Tomcat 7或Jetty 8)。 我使用maven-assembly-plugin 2.2.1创建war文件(我正在运行maven 3)。 在Maven构建过程中,所有工作都非常完美,并创建了分发存档。
但是当我尝试部署战争文件时,虽然一切都已到位(Web-inf / lib等),但我得到了ClassNotFound-Exceptions(例如Spring ContextLoaderListener等)。 所以,webapp不会启动。 然后我将war-file解包到servlet容器的webapp目录中,一切工作正常......?
经过进一步调查,我发现了以下情况:如果我使用maven-war-plugin(!)创建的任意war文件A',请将其内容替换为使用maven-assembly-plugin创建的war文件中的解压缩内容让我称它为A.)我可以看到两件事情发生:
这很奇怪,我完全不知道发生了什么。 也许有一个问题,maven-war-plugin和maven-assembly-plugin处理war文件的打包方式不同?! 我的意思是,一场战争只是一个带有一些预定义结构的重命名的zip文件...也许它与maven完全没有关系,但与文件编码或其他东西? 对此有何想法? 我很感激任何提示,这可以帮助我调查这个...
这是我的装配描述符
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>dist</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<includes>
<include>mypackage.client:parametermgmt:*</include>
<include>mypackage.static:client:*</include>
</includes>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>/</outputDirectory>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<includes>
<include>mypackage.server.database:domain:*</include>
<include>mypackage.server.businessobjects:BOdomain:*</include>
<include>mypackage.server.security:security:*</include>
<include>mypackage.server.services:paramgmt:*</include>
</includes>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>Web-inf/lib</outputDirectory>
</dependencySet>
<dependencySet>
<unpack>true</unpack>
<includes>
<include>mypackage.static:server:*</include>
</includes>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>/</outputDirectory>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<includes>
<include>*</include>
</includes>
<excludes>
<exclude>mypackage.*</exclude>
</excludes>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>Web-inf/lib</outputDirectory>
</dependencySet>
</dependencySets>
maven-assembly-plugin不打算造成战争。 为此,请使用maven-war-plugin。
如果你需要为不同的环境创建war文件,比如test,qa,production。 这可以作为不同应用程序服务器的基础。 但是如果我们正在讨论应用服务器,这意味着我们应该创建ear文件而不是war文件(这意味着使用maven-ear-plugin而不是maven-war-plugin)。
|-- pom.xml
`-- src
|-- main
| |-- java
| |-- resources
| |-- environment
| | |-- test
| | | `-- database.properties
| | |-- qa
| | | `-- database.properties
| | `-- production
| | `-- database.properties
| `-- webapp
您需要以下程序集(对于每个环境),可以基于此创建它作为模板:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>test</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<useProjectArtifact>true</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<outputDirectory>WEB-INF</outputDirectory>
<directory>${basedir}/src/main/environment/test/</directory>
<includes>
<include>**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
为了支持不同环境中的不同工件,这是maven-assembly-plugin的时间,就像这样:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>test</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor>
</descriptors>
</configuration>
</execution>
<execution>
<id>qa</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/qa.xml</descriptor>
</descriptors>
</configuration>
</execution>
<execution>
<id>production</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
其结果是创建三个不同的战争文件,这些文件可以通过适当的分类器用一次调用区分开来(详细说明可以在这里阅读):
mvn clean package
链接地址: http://www.djcxy.com/p/29609.html