2016-01-21 5 views
2

Я пытаюсь заставить мой сервер Tomcat служить файлу. Я сделал очень простой пример, чтобы показать вам, что не так, и даже если это просто, это не работает.Tomcat не служит для файлов из maven-war-plugin

Мой проект сделан так:

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, даже если, когда у меня есть смотреть «.war» генерируется, я вижу:

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

Я не могу понять, почему у меня есть доступ к одному, но я могу (404 ошибка) ...

ответ

3

Вы не можете получить доступ к testB.txt, потому что при запуске tomcat6:run, Кота Maven плагин будет выглядеть в папке webapp по умолчанию, а не в генерируемой войне файла (через package фазы), ни в сгенерированной распакованной войне в папке target.

Это сделано специально, чтобы вы могли создавать на лету новые ресурсы или изменять их содержимое, а изменения будут доступны в исполняемом экземпляре (горячее развертывание).

Вы можете проверить его:

  • Добавить дополнительный testC.txt в файл войны, он будет проигнорирован запущенным экземпляром
  • Добавьте дополнительный testC.txt к встроенной распакованной войне, оно будет проигнорировано
  • Добавить дополнительный testC.txt в папку webapp, он будет доступен!

От его official documentation:

расположение

по умолчанию $ {имя_базовой_папки}/SRC/главная/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> 

Примечание: она теперь указывает на Maven, построенной с помощью package фазы. И это сработает.

+0

Спасибо за объяснение. Я не знал об этом. Сейчас он работает отлично. – Utundu

2

tomcat6:run не запускает упакованную войну, вместо этого используйте mvn tomcat6:run-war.

+0

Это тоже работает. Благодаря ! – Utundu