我已经研究继承代码几天了,并试图了解 Maven 的工作原理以及项目为何按原样配置。该项目使用 Jetty 作为 http 服务器,并提供 Angular 应用程序,此外还使用 Jersey 为 Angular 应用程序提供 RESTful 端点。项目目录为:
src
main
config
java
Java code, including Jetty server
webapp
WEB-INF
web.xml
index.html and all things Angular are also in this directory
作为部署过程的一部分,我被告知要设置 Maven,以便将项目打包为 .war。为此,我有以下内容:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
<configuration>
<packagingExcludes>WEB-INF/lib</packagingExcludes>
<webappDirectory>src/main/webapp</webappDirectory>
<warName>${project.name}</warName>
</configuration>
</plugin>
</plugins>
当我运行mvn install
时,在我的src/main/webapp/WEB-INF
中生成以下两个:lib/
和类/
。现在,当我运行该项目时,我在 Java 级别发生冲突,我发现问题的原因是这两个新目录现在存在于我的 target/classes/WEB-INF
中。删除它们并运行:target/classes/com.../Root.class
可以解决问题。但是,如果存在 target/classes/WEB-INF/classes/com.../Root.class
,项目就会在运行时开始引发异常。在不深入研究低级异常本身的情况下,有人可以解释为什么我会/不希望为我生成 WEB-INF/classes
和 WEB-INF/lib
,如果我不想要它们,我怎样才能在 Maven 中禁用它们的创建?
编辑:我发现用 webXml
属性替换 webappDirectory
属性将阻止复制 lib/
和 classes/
,但是,我仍然不清楚为什么我首先想要这些目录。
最佳答案
Maven 遵循“约定优于配置”的理念。
您想要一个不遵循惯例的 WebApp 的愿望导致了您遇到的问题。
注释掉整个<plugin>
适合您的元素maven-war-plugin
,确保您有<packaging>war</packaging>
设置,然后您将得到等式的“约定”部分。
作为 WAR 文件构建的 Web 应用程序,其中包含所有依赖项(如有关 Web 应用程序定义的 Servlet 规范)。
WEB-INF/lib
是您的 web 应用程序所需的所有依赖项的查找位置。无论是 WAR 文件格式,还是分解格式。
但是,您似乎想要从 Maven 获取分解的 WAR 文件,不知道为什么,因为这在构建过程中不再有任何好处。 (您可以使用默认的 war 行为和各种 Web 容器 Maven 插件,直接从 Maven 在您选择的嵌入式容器中运行 Web 应用程序)
如果您坚持爆炸,请考虑以下建议:
- 确保您的
<packaging>war</packaging>
设置在您的<project>
上 - 阅读
maven-war-plugin:exploded
上的文档 - 排除的唯一原因
WEB-INF/lib
来自 war 文件是如果您的 WAR 文件没有 jar 文件依赖项。如果是这种情况,那么您应该指定正确的<scope>
您的值<dependency>
防止它们被包含在您的WEB-INF/lib
中目录。 <webappDirectory>
配置元素是您的 OUTPUT 目录,在其中生成和生成构建的 WAR 文件内容。 (不要指定此配置值,保留默认值)<warSourceDirectory>
是您的 INPUT 目录,非编译类、类路径资源或依赖项/库的文件都来自该目录。 (不要指定此配置值,保留默认值)<warName>
元素未使用,其无效。- 指定
<build><finalName>
for configuring the war filename适合自己。
简而言之,您不需要 <configuration>
为您的maven-war-plugin
部分.
关于java - 如何防止 mvn install 创建 WEB-INF/lib 和类?或者说我为什么想要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32656522/