2016-12-03 2 views
4

Я пытаюсь сделать свой хост Java-приложения веб-страницей (HTML-страницей, а не JSP) через Apache Tomcat, встроенной в приложение. Я использую Maven для системы сборки на NetBeans IDE 8.0.2. По какой-то причине Tomcat отказывается распознавать страницу index.html, которую я разместил в приложении, несмотря на множество попыток и создание всех видов папок, таких как WEB-INF. Но он все равно бросает на меня ошибку 404.Java + Maven + Embedded Tomcat: проект отказывается распознавать веб-страницу

Вот некоторые из соответствующего кода, как я настроил в моем проекте (некоторый код был опущен, но не имеет отношения к ситуации):

1. MainApplication.java - разжигает Tomcat

import java.util.Calendar; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.io.*; 
import java.util.Optional; 
import org.apache.catalina.startup.Tomcat; 

public class MainApplication{ 

    public static final Optional<String> port = Optional.ofNullable(System.getenv("PORT")); 

    public static void main(String[] args) throws Exception { 
     String contextPath = "/"; 
     String appBase = "."; 
     Tomcat tomcat = new Tomcat(); 
     tomcat.setPort(Integer.valueOf(port.orElse("8080"))); 
     tomcat.getHost().setAppBase(appBase); 
     tomcat.addWebapp(contextPath, appBase); 
     tomcat.start(); 
     tomcat.getServer().await(); 
    } 
} 

2. ShuttleServlet.java

@WebServlet(
      name = "ShuttleServlet", urlPatterns = {"/shuttle"} 
    ) 

public class ShuttleServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     // Code to interact with application to be added later 
    } 

3. Структура каталогов

- src 
| 
- main 
| 
    - resources 
    - webapp 
    | 
    * index.html 
    * scripts.js 

4. Maven pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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>com.example</groupId> 
    <artifactId>TransportApp</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-core</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-logging-juli</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jasper</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jasper-el</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jsp-api</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>6.0.5</version> 
     </dependency> 
    </dependencies> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <tomcat.version>7.0.57</tomcat.version> 
    </properties> 
    <build> 
    <finalName>TransportApp</finalName> 
    <resources> 
     <resource> 
      <directory>src/main/webapp</directory> 
      <targetPath>META-INF/resources</targetPath> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <inherited>true</inherited> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration>   
     </plugin>  
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>TransportApp-${project.version}</finalName> 
       <archive> 
        <manifest> 
         <mainClass>com.example.TransportApp.MainApplication</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin>  
    </plugins> 
</build>    
</project> 

5. Журналы консоли Tomcat

Dec 04, 2016 3:09:24 AM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-bio-8080"] 
Dec 04, 2016 3:09:24 AM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Tomcat 
Dec 04, 2016 3:09:24 AM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.57 
Dec 04, 2016 3:09:24 AM org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment 
INFO: No global web.xml found 
Dec 04, 2016 3:09:25 AM org.apache.catalina.util.SessionIdGenerator createSecureRandom 
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [170] milliseconds. 
Dec 04, 2016 3:09:25 AM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 

Все эти результата в 404 что была постоянной, несмотря на многочисленные попытки и теперь удаленные папки. Надеюсь, все это поможет найти преступника.

ответ

1

Первый специалист стара, использовать Gradle вместо;)

Каждый процесс имеет рабочий каталог, а когда файл относительна будет интерпретироваться по отношению к этому. Это важно понять, потому что, если вы не используете это для простого теста, структура каталогов может отличаться от разработки и развертывания.

Если вы создаете свою программу как файл jar, то относительный URL-адрес, например «./src/main/webapp», скорее всего, не сработает, потому что «src/main» исчезнет, ​​и останется только «webapp» (как когда вы создаете WAR-файл).

Сборка инструментов, таких как Gradle (и Maven), и ваша среда IDE имеет этап «processResource» после компиляции, который копирует ресурсы в место, которое (как правило) будет частью пути к классам. Поскольку/main/resources/webapp не будет скопирован, если вы не создаете webapp, у вас будут проблемы с кодом вне вашей среды разработки.

Лично я бы рекомендовал вам создать приложение для загрузки Spring, в котором уже есть встроенный tomcat. В Spring Boot .html файлы загружаются из пути к классам (main/resources/static), а поскольку ресурсы находятся внутри пути к классам, они будут иметь одинаковое расположение как в разработке, так и в развертывании (из-за обработки ресурсов).

Для веба-приложений весны загрузки вы будете нуждаться в одном DEPENDENCY org.springframework.boot: весна-загрузка-стартер-сети: 1.4.1.RELEASE Так что ваша сборке.Gradle файл будет выглядеть следующим образом (Вы можете создать проект Gradle в вашей IDE)

apply plugin: 'java' 
sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:1.4.1.RELEASE") 
} 

Ваш Java Main будет выглядеть следующим образом

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class Main { 
    public static void main(String[] args) { 
     SpringApplication.run(Main.class, args); 
    } 
} 

Put вы .html файл в/основные/ресурсы/static - DONE !! Как вы, наверное, догадались, что внутри весенней загрузки много волшебства, и причина, по которой вам больше не нужно писать код, заключается в том, что команда Spring Boot выбрала очень хороший дефолт, но не беспокойтесь, если вам нужно чтобы получить более продвинутый позже, это также возможно. Если вам нужен рендеринг сервера, вы можете добавить org.springframework.boot: spring-boot-starter-thymeleaf: {version}, и поместите свои шаблоны в/resources/templates и там вы идете. Там есть много хороших учебников.

Весна также имеет гораздо лучшую абстракцию поверх сервлетов, называемых контроллерами, снова много документации.

+0

Почему бы вам ответить с некоторыми Gradle + Spring загрузочного кода, когда он спросил о автономной, встраивать Tomcat с Maven? –

0

Попробуйте использовать SpringBoot !!! который имеет встроенный tomcat, использование сети и тимелеафа, thymeleaf - это механизм шаблонов, который распознает вашу веб-страницу. попытайтесь создать проект загрузки весны с этого сайта http://start.spring.io/, который является инициализатором весны, используемым для создания проекта maven с весенним ботинком. Добавьте зависимости в Интернете и тимелеафа и создайте проект. Импорт проекта в вашем IDE как проект Maven, или использовать Spring инструмент костюм

DemoApplication.java

@Controller 
@SpringBootApplication 
public class DemoApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
    @RequestMapping(value = "/homepage" , method = RequestMethod.GET ) 
    public String sample() 
    { 
     return "home"; 

    } 
} 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <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>com.example</groupId> 
<artifactId>demo</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>demo</name> 
<description>Demo project for Spring Boot</description> 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.2.RELEASE</version> 
    <relativePath /> <!-- lookup parent from repository --> 
</parent> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <java.version>1.7</java.version> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
    </build> 
    </project> 

home.html

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"></meta> 
<title>HomePage</title> 
</head> 
<body> 
<h1>MY Spring Boot Home Page</h1> 
</body> 
</html> 
+1

ваше решение для отображения html-файла должно включать в себя 3 новые библиотеки и реструктуризацию всего приложения? – zack6849

1

Основная причина проблемы :

Вопрос относится к классу Launcher. В классе launcher ниже строки кода пытаются заглянуть в один и тот же каталог для веб-приложения, что по существу неверно.

tomcat.addWebapp(contextPath, appBase); 

Поскольку appBase установлен на «», что означает, что он будет пытаться заглянуть в тот же каталог, где ваш класс Пусковая.

Решение

Попробуйте использовать ниже код, который довольно прямо вперед, чтобы понять. Вы должны правильно установить путь webApp в контексте tomcat, чтобы распознать его, когда вы нажмете этот путь во время выполнения.

String webappDirLocation = "src/main/webapp/"; 
    Tomcat tomcat = new Tomcat(); 

    //The port that we should run on can be set into an environment variable 
    //Look for that variable and default to 8080 if it isn't there. 
    String webPort = System.getenv("PORT"); 
    if(webPort == null || webPort.isEmpty()) { 
     webPort = "8080"; 
    } 

    tomcat.setPort(Integer.valueOf(webPort)); 

    StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath()); 
    System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath()); 

    // Declare an alternative location for your "WEB-INF/classes" dir 
    // Servlet 3.0 annotation will work 
    File additionWebInfClasses = new File("target/classes"); 
    WebResourceRoot resources = new StandardRoot(ctx); 
    resources.addPreResources(new DirResourceSet(resources, "/WEB-  INF/classes", additionWebInfClasses.getAbsolutePath(), "/")); 
    ctx.setResources(resources); 

    tomcat.start(); 
    tomcat.getServer().await(); 
0

Я думаю, что Вы не Hostname часть, а также шаги здания от maven.Try для запуска с Maven команд и Java -jar командует. Попробуйте выполнить следующие работы или нет.

public static final Optional<String> PORT = Optional.ofNullable(System.getenv("PORT")); 
public static final Optional<String> HOSTNAME = Optional.ofNullable(System.getenv("HOSTNAME")); 

public static void main(String[] args) throws Exception { 
    String contextPath = "/" ; 
    String appBase = "."; 
    Tomcat tomcat = new Tomcat(); 
    tomcat.setPort(Integer.valueOf(PORT.orElse("8080"))); 
    tomcat.setHostname(HOSTNAME.orElse("localhost")); 
    tomcat.getHost().setAppBase(appBase); 
    tomcat.addWebapp(contextPath, appBase); 
    tomcat.start(); 
    tomcat.getServer().await(); 
} 

Folow это шаги: (вы должны иметь Maven локально установленный) Open ЦМД, Перейти к исходной папке, где находится файл ПОМ.Есть следующие команды

МВН компилировать

затем нажмите клавишу ВВОД

МВН пакет.

затем нажмите клавишу ВВОД

цель кд затем нажмите клавишу ВВОД

Java -jar [ваше имя приложения] .jar (в целевой папке вы увидите файл банку, поставить его имя здесь)

После запуска команды вы сможете бродить по localhost в браузере. Netbeans run дал мне 404. Я решил это так.

вы можете проверить эту ссылку запущенной части веб-приложения: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/basic_app_embedded_tomcat/basic_app-tomcat-embedded.html

0

Я не знаю, если вы решили эту проблему, описанную здесь. Надеюсь, это поможет другим. Чтобы внедрить Tomcat, я использовал плагин, а не зависимости: так что для этого не нужен основной класс и код для создания экземпляра tomcat.
Вот что ПОМ должны включать в себя:

<project ...> 
    ..... 
    <dependencies> 
    <!-- no need of any ---> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.3</version> 
     </plugin> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.tomcat.maven</groupId> 
      <artifactId>tomcat7-maven-plugin</artifactId> 
      <version>2.2</version> 
      <configuration>      
       <server>localhost</server> 
       <path>/${project.build.finalName}</path> 
      </configuration> 
     </plugin> 

    </plugins> 
    </build> 
</project> 

Вот пример web.xml

<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 


    <display-name>My Test App</display-name> 
    <description>A test app</description> 

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

    <session-config> 
    <session-timeout>30</session-timeout> 
    </session-config> 
</web-app> 

Вам не нужно ни главный класс, ни код внутри (как в вопросе). Мы, конечно, нужно, чтобы показать страницы, так вот пример index.html (как указано в web.xml):

<html> 
    <body> 
     <h2>Hello World!</h2> 
    </body> 
</html> 

В затмении: щелкните правой кнопкой мыши, работает как «Беги configuratuions» , в разделе «Maven Build» добавьте «Новая конфигурация запуска», установите базовый каталог и введите «Цели»: tomcat7: run. ThaT's it! Вы должны получить:

[INFO] Scanning for projects... 
[INFO]                   
[INFO] -------------------------------------------------------------------- 
[INFO] Building rest-with-jersey Maven Webapp 0.0.1-SNAPSHOT 
[INFO] -------------------------------------------------------------------- 
[INFO] 
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) > process-classes @ rest-with-jersey >>> 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ rest-with-jersey --- 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ rest-with-jersey --- 
[INFO] Nothing to compile - all classes are up to date 
[INFO] 
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) < process-classes @ rest-with-jersey <<< 
[INFO] 
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ rest-with-jersey --- 
[INFO] Running war on http://localhost:8080/rest-with-jersey 
[INFO] Using existing Tomcat server configuration at /common/home/$$$/$$$$/lnx/workspace/rest-with-jersey/target/tomcat 
[INFO] create webapp with contextPath: /rest-with-jersey 
Sep 11, 2017 4:03:07 PM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-bio-8080"] 
Sep 11, 2017 4:03:07 PM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Tomcat 
Sep 11, 2017 4:03:07 PM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 
Sep 11, 2017 4:03:09 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 

In a browser with http://localhost:8080/rest-with-jersey/ you get the " Hello World!". 
Смежные вопросы