java - 如何防止 mvn install 创建 WEB-INF/lib 和类?或者说我为什么想要它?

标签 java angularjs maven

我已经研究继承代码几天了,并试图了解 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/classesWEB-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/

相关文章:

java - 将一个类似java套接字的程序放在云服务中

java - 如何使用 Java 在 Tomcat 中以编程方式找出打开 session 的数量?

javascript - AngularJS 的工厂设计模式,这是正确的方法吗?

angularjs - 我们可以编写一个可用于所有模块但仅实例化一次的自定义 AngularJS 服务吗

javascript - javascript中的angular ng-repeat预过滤器

java - 如何将一个 Maven 项目用作另一个 Maven 项目的依赖项?

java - 由于依赖于 postgres 容器,spring boot 容器未运行

android - 如何使用 Maven 为 Android 项目过滤资源?

java - 在多维数组中存储信息并在JOptionPane中显示信息

java - 使用 JDBC 连接到 SQL Server 2012 时出现问题