# Tomcat Server zeigt Webservice nicht an



## thomasmue (17. Dez 2019)

Guten Abend,

zuerst: Dies ist mein erster Post in diesem Forum, also Bitte ich um Nachsicht, falls dies das falsche Unterforum ist, 
oder ich gewisse Gepflogenheite missachte.
Jetzt aber los:
Ich habe nun im Rahmen meiner Ausbildung schon einiges an Java programmiert (vorher Delphi,Python,PHP), würde mich aber
in keinster Weise als Java-Programmierer bezeichnen.
Nichtsdestorotz wollte ich einmal in die Entwicklung mit Java Web Services reinschnuppern.
Ich benutzt zurzeit die IntelliJ Ultimate Edition.
Dort habe ich ein Projekt als WebService angelegt und auch Restful mit dazugenommen.
Als Deployment Server habe ich mir Tomcat 8.5.50 heruntergeladen.
Dabei habe ich alles so wie hier gemacht: https://www.jetbrains.com/help/idea/creating-and-running-your-first-restful-web-service.html
ausser das ich anstatt Glassfish einfach Tomcat genommen habe. 
Wenn ich nun aber meine Anwendung starte, bekomme ich zwar nicht direkt Fehlermeldungen, der ganze Text ist aber rot hinterlegt:


```
[COLOR=rgb(0, 0, 0)][2019-12-17 09:16:38,486] Artifact WebApp:war exploded: Waiting for server connection to start artifact deployment...
Using CATALINA_BASE:   "C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp"
Using CATALINA_HOME:   "C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50"
Using CATALINA_TMPDIR: "C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_60"
Using CLASSPATH:       "C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\bin\bootstrap.jar;C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\bin\tomcat-juli.jar"[/COLOR]
[COLOR=rgb(226, 80, 65)]17-Dec-2019 21:16:39.381 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log
 Server Version:        Apache Tomcat/8.5.50
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 7 2019 19:19:46 UTC
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.50.0
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Windows 10
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.0
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Architektur:          amd64
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             C:\Program Files\Java\jdk1.8.0_60\jre
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_60-b27
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Hersteller:            Oracle Corporation
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log
 CATALINA_BASE:         C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp
17-Dec-2019 21:16:39.382 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp\conf\logging.properties
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote=
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=1099
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.password.file=C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp\jmxremote.password
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.access.file=C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp\jmxremote.access
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=127.0.0.1
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\Users\dillinger\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_20_WebApp
17-Dec-2019 21:16:39.383 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50
17-Dec-2019 21:16:39.386 INFORMATION [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\temp
17-Dec-2019 21:16:39.386 INFORMATION [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_60\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Embarcadero\Studio\20.0\bin;C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl;C:\Program Files (x86)\Embarcadero\Studio\20.0\bin64;C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\Win64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Mullvad VPN\resources;C:\Users\dillinger\Documents\Programme\installation\Git\cmd;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\dillinger\AppData\Local\Microsoft\WindowsApps;C:\Users\dillinger\AppData\Local\GitHubDesktop\bin;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Users\dillinger\Documents\Programme\installation\intellij\IntelliJ IDEA Community Edition 2019.3\bin;;C:\Users\dillinger\Documents\Programme\installation\intellij_ultimate\IntelliJ IDEA 2019.3\bin;;.]
17-Dec-2019 21:16:39.474 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initialisiere ProtocolHandler["http-nio-8080"]
17-Dec-2019 21:16:39.523 INFORMATION [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
17-Dec-2019 21:16:39.534 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initialisiere ProtocolHandler["ajp-nio-8009"]
17-Dec-2019 21:16:39.536 INFORMATION [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
17-Dec-2019 21:16:39.536 INFORMATION [main] org.apache.catalina.startup.Catalina.load Initialization processed in 418 ms
17-Dec-2019 21:16:39.560 INFORMATION [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
17-Dec-2019 21:16:39.561 INFORMATION [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.50
17-Dec-2019 21:16:39.567 INFORMATION [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
17-Dec-2019 21:16:39.575 INFORMATION [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
17-Dec-2019 21:16:39.577 INFORMATION [main] org.apache.catalina.startup.Catalina.start Server startup in 40 ms[/COLOR]
[COLOR=rgb(0, 0, 0)]Connected to server
[2019-12-17 09:16:40,067] Artifact WebApp:war exploded: Artifact is being deployed, please wait...
[2019-12-17 09:16:40,366] Artifact WebApp:war exploded: Artifact is deployed successfully
[2019-12-17 09:16:40,366] Artifact WebApp:war exploded: Deploy took 299 milliseconds[/COLOR]
[COLOR=rgb(226, 80, 65)]17-Dec-2019 21:16:49.576 INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploye Web-Applikations-Verzeichnis [C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\webapps\manager]
17-Dec-2019 21:16:49.637 INFORMATION [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\Users\dillinger\Documents\Programmierung\Java\BlindSight\server\apache-tomcat-8.5.50\webapps\manager] has finished in [60] ms[/COLOR]
```

Wenn ich auf localhost::8080/WebApp_war_exploded zugreife, bekomme ich nur ein "$END$"
und wenn ich auf localhost::8080/WebApp_war_exploded\helloworld zugreife ein 404

Mein Code ist wie in dem besagten Beispiel:
MyApplication Klasse:

```
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

//Defines the base URI for all resource URIs.
@ApplicationPath("/")
//The java class declares root resource and provider classes
public class MyApplication extends Application{
    //The method returns a non-empty collection with classes, that must be included in the published JAX-RS application
    @Override
    public Set<Class<?>> getClasses() {
        HashSet h = new HashSet<Class<?>>();
        h.add( HelloWorld.class );
        return h;
    }
}
```

HelloWorld Klasse:

```
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

// The Java class will be hosted at the URI path "/helloworld"
@Path("/helloworld")
public class HelloWorld {
    // The Java method will process HTTP GET requests
    @GET
    // The Java method will produce content identified by the MIME Media type "text/plain"
    @Produces("text/plain")
    public String getClichedMessage() {
        // Return some cliched textual content
        return "Hello World";
    }
}
```

Bei jedem der bis hier hin gekommen ist bedanke ich mich schonmal fürs lesen und hoffe das dazu ein paar Ideen gibt.

Grüße thomasmue


----------



## mihe7 (18. Dez 2019)

thomasmue hat gesagt.:


> localhost::8080/WebApp_war_exploded\helloworld


Der Backslash ist auf jeden Fall falsch (und warum zwei Doppelpunkte?) und es könnte auch sein, dass Du nur WebApp brauchst:



			http://localhost:8080/WebApp/helloworld


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Der Backslash ist auf jeden Fall falsch (und warum zwei Doppelpunkte?) und es könnte auch sein, dass Du nur WebApp brauchst:
> 
> 
> 
> http://localhost:8080/WebApp/helloworld


Leider komme ich in der Arbeit nicht auf mein KeePass, deswegen schreibe ich hier mit dem Account von einem Kollegen:
Danke schonma für den Vorschlag.
Auch mit Slash geht es leider nicht. Auch nur WebApp geht nicht. Die zwei Doppelpunkte waren ein Schreibfehler meinerseits.
Das bessere ich aus, sobald ich daheim auf mein KeePass komme und mich einloggen kann.
Wenn ich auf http://localhost:8080/WebApp gehe zeigt er $END$ und als Caption vom Tab $Title$ an.


----------



## mihe7 (18. Dez 2019)

Hast Du Dir schon mal auf der Management Console von TomCat die Anwendung angesehen? Da sollte eigentlich dir URL enthalten sein.


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Hast Du Dir schon mal auf der Management Console von TomCat die Anwendung angesehen? Da sollte eigentlich dir URL enthalten sein.


Ich weiss ehrlichgesagt nicht wie ich da hin komme. Bei einer vorherigen Tomcat Installation war die einfach auf http://localhost:8080 und dann auf Manager App mit dem Entsprechenden Account einloggen. Aber hier bekomme ich nur eine weiße Seite wenn ich auf http://localhost:8080 gehe.
Im Verzeichnis apache-tomcat-8.5.20/webapps/manager finde ich auch nur die (glaub ich) erstellte WebApp


----------



## mihe7 (18. Dez 2019)

http://localhost:8080/manager/html


----------



## lereis (18. Dez 2019)

Ja also da sagr er mit den link http://localhost:8080/WebApp_war_exploded/ den ich schon kannte. Also wird mir wieder $END$ angezeigt. Status ist aber "running"


----------



## mihe7 (18. Dez 2019)

OK, dann sollte der Link tatsächlich http://localhost:8080/WebApp_war_exploded/helloworld heißen. 

Was steht in Deiner web.xml und welche Libs hast Du alle eingebunden?


----------



## lereis (18. Dez 2019)

Die habe ich noch nicht editiert:

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>
```


----------



## mihe7 (18. Dez 2019)

Kannst Du noch dein pom.xml bzw. build.gradle-File posten?


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Kannst Du noch dein pom.xml bzw. build.gradle-File posten?


Solche Datein kann ich nicht finden. Hat pom.xml nicht etwas mit Maven zu tun? Soll ich das mal als Framework Support hinzufügen?


----------



## mihe7 (18. Dez 2019)

lereis hat gesagt.:


> Solche Datein kann ich nicht finden.


In Deinem Projekt-Verzeichnis (Dateiebene) solltest Du eigentlich schon solche Dateien haben.


----------



## lereis (18. Dez 2019)

Villeicht stelle ich mich auch an, aber ich kann nichts entdecken


Ich habe auch einmal die "WebApp_war exploded.war" als zip mit angehängt.
In der index.jsp steht auch das $END$ das ich immer angezeigt bekomme.
Bedeutet für mich:
->Tomcat läuft korrekt
->Programm wird korrekt deployed
Also muss es ja irgendwie in der Programmierung liegen.


----------



## mihe7 (18. Dez 2019)

lereis hat gesagt.:


> Villeicht stelle ich mich auch an


Ne, anscheinend verwendet IntelliJ ein internes Build-System  

Also, meine Vermutung ist folgende: Du verwendest ja keinen Java EE Server sondern nur einen Servlet Container. Viele Bibliotheken muss die Anwendung daher selbst mitbringen, die normalerweise nicht ausgeliefert werden (weil der Java EE Server sie bereits hat). 

Beispielsweise müsstest Du für Tomcat eine Abhängigkeit zum jersey-container-servlet und nicht zu grizzly haben. 

Ich kann Dir evtl. nachher mal ein Maven-Projekt zusammenschustern, das unter Tomcat funktioniert.


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Ne, anscheinend verwendet IntelliJ ein internes Build-System
> 
> Also, meine Vermutung ist folgende: Du verwendest ja keinen Java EE Server sondern nur einen Servlet Container. Viele Bibliotheken muss die Anwendung daher selbst mitbringen, die normalerweise nicht ausgeliefert werden (weil der Java EE Server sie bereits hat).
> 
> Beispielsweise müsstest Du für Tomcat eine Abhängigkeit zum jersey-container-servlet und nicht zu grizzly haben.



Ich kenne mich (offensichtlich) nicht wirklich aus, aber ich habe beim Erstellen des Tomcat Servers den normalen "Tomcat Server" und nicht den "TomcatEE Server genommen".
Wenn ich den TomcatEE Server nehmen bekommen ich bei der Configuration das Problem dass er mein TomEE Home Verzeichnis nicht schluckt. Base directory nimmt er(villeicht aber nur weil es ein conf Unterverzeichnis gibt).
Ich kann aber mal schauen ob ich einen TomcatEE Server herunterladen kann. 



mihe7 hat gesagt.:


> Ich kann Dir evtl. nachher mal ein Maven-Projekt zusammenschustern, das unter Tomcat funktioniert.


Das wäre natürlich super.
Vielen Dank auch schonmal für die Geduld und die sehr schnellen Antworten


----------



## mihe7 (18. Dez 2019)

Anbei ein ZIP, getestet mit Tomcat 8.5.50. Maven erzeugt ein WAR, das Du dann deployen kannst. 

Da ich nicht weiß, wie sich IntelliJ verhält: die Datei findet sich nach dem Build im target-Verzeichnis (hello-rest.war) und wird zum Deployen ins webapps-Verzeichnis des Tomcat kopiert. Danach: http://localhost:8080/hello-rest/helloworld


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Anbei ein ZIP, getestet mit Tomcat 8.5.50. Maven erzeugt ein WAR, das Du dann deployen kannst.
> 
> Da ich nicht weiß, wie sich IntelliJ verhält: die Datei findet sich nach dem Build im target-Verzeichnis (hello-rest.war) und wird zum Deployen ins webapps-Verzeichnis des Tomcat kopiert. Danach: http://localhost:8080/hello-rest/helloworld


Also das klappt jetzt.
Unter http://localhost:8080/hello_rest_war/helloworld bekomme ich nun mein "Hello World!"
Dankeschön schonmal.
Ich schau mir jetzt mal an wo die Unterschiede liegen und melde mich dann nochmal.


----------



## mihe7 (18. Dez 2019)

Das liegt garantiert an den Bibliotheken. Vergleich einfach mal die Jars der WARs


----------



## lereis (18. Dez 2019)

Okay wow. Es klappt jetzt. Ich bin begeistert.
Also für alle die das Gleiche Problem haben:
Ich habe nach der Erstellung meines Projektes mit:
Rechtsclick Projektname->Add Frameworks Support->Maven->OK
Maven dem Projekt hinzugefügt.
Dannach habe ich die Folgenden dependencies meiner pom.xml hinzugefügt:

```
<packaging>war</packaging>
    <dependencies>
    <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet</artifactId>
      <version>2.29.1</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.inject</groupId>
      <artifactId>jersey-hk2</artifactId>
      <version>2.29.1</version>
    </dependency>
  </dependencies>
    <build>
        <finalName>hello-rest</finalName>
    </build>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
```
(Parameter finalName sollten vl. noch angepasst werden)
Jetzt klappt alles perfekt.
Ein riesen Dank an mihe7 der die Sache im Alleingang und mit viel Geduld gelöst hat.


----------



## mihe7 (18. Dez 2019)

lereis hat gesagt.:


> Also für alle die das Gleiche Problem haben:


Super, dass Du der Nachwelt die Lösung postest. 

Noch eines: es müsste theoretisch auch mit dem internen Buildsystem von IntelliJ funktionieren, da ich mich da aber nicht auskenne, überlasse ich das anderen. Außerdem würde ich sowieso davon abraten, ein IDE-spezifisches System zu verwenden. Das macht die Zusammenarbeit ggf. sehr schwer.


----------



## lereis (18. Dez 2019)

mihe7 hat gesagt.:


> Super, dass Du der Nachwelt die Lösung postest.
> 
> Noch eines: es müsste theoretisch auch mit dem internen Buildsystem von IntelliJ funktionieren, da ich mich da aber nicht auskenne, überlasse ich das anderen. Außerdem würde ich sowieso davon abraten, ein IDE-spezifisches System zu verwenden. Das macht die Zusammenarbeit ggf. sehr schwer.


Alles klar. Ich denke das mit der pom.xml erfüllt auf jeden Fall seinen Zweck. Wenn ich daheim bin könnte ich das Thema auch als erledigt markieren (falls es soetwas gibt).


----------



## mihe7 (18. Dez 2019)

Erledigt gibt's hier nicht. Ja, Maven dürfte immer noch der Platzhirsch unter den Java EE Entwicklern sein.


----------

