Tomcat不提供来自maven-war-plugin的文件

时间:2016-01-21 20:51:50

标签: maven tomcat maven-war-plugin

我正在尝试让我的Tomcat服务器提供文件。我做了一个非常简单的例子来向你展示什么是错的,即使它很简单,它也不起作用。

我的项目是这样的:

test
|->assets
|   |->testB.txt
|->src
|  |->main
|  |  |->webapp
|  |  |  |->WEB-INF
|  |  |  |  |->web.xml
|  |  |  |->testA.txt
|-> pom.xml

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>assets/</directory>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat6-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

如果我执行mvn package tomcat6:run,我可以访问testA.txt,但我无法访问testB.txt,即使我看了&#34; .war& #34;生成,我明白了:

|->testA.txt
|->testB.txt
|->META-INF
|->WEB-INF
|  |->web.xml
|  |->classes

我无法弄清楚为什么我可以访问其中一个但我无法看到另一个(404错误)......

2 个答案:

答案 0 :(得分:3)

您无法访问testB.txt,因为在运行tomcat6:run时,Tomcat Maven插件默认情况下会查看webapp文件夹,而不是生成的war文件(通过package }}或者target文件夹中生成的解压缩战争。

这是故意制作的,以便您可以动态创建新资源或更改其内容,并且可以在正在运行的实例上进行更改(热部署)。

您可以通过以下方式验证:

  • 向war文件添加其他testC.txt,正在运行的实例
  • 将忽略该文件
  • 在构建的解压缩战争中添加额外的testC.txt,将被忽略
  • 在webapp文件夹中添加一个额外的testC.txt,它将可用!

来自official documentation

  

默认位置是$ {basedir} / src / main / webapp

您可以通过warSourceDirectory元素进行配置。在您的情况下,您希望将其指向target文件夹的内置解压缩战争。因此,您可以按以下方式更改配置:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat6-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <path>/</path>
        <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory>
    </configuration>
</plugin>

注意:它现在指向通过package阶段构建的Maven。它会起作用。

答案 1 :(得分:2)

tomcat6:run没有运行打包的战争,请尝试使用mvn tomcat6:run-war