# Maven und Spring: "Add to classpath" ?



## von Spotz (10. Sep 2021)

Hallo,
ich bin ein Java-Neuling und kenne mich noch nicht gut mit den Maven-Konzepten oder auch manchen anderen Begriffen aus. Ich wollte dieses Tutorial hier durchgehen https://usha-dewasi.medium.com/service-registry-using-spring-cloud-netflix-eureka-cba573c693b und bleibe am Anfang bei 


> Add *org.springframework.boot:spring-cloud-starter-eureka-server *on your classpath.


hängen. Ich habe den Begriff von "classpath dependencies" nur hier (https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html) und den begriff "classpath" hier (https://maven.apache.org/shared/maven-archiver/examples/classpath.html) beschrieben gefunden. Ich glaube aber nicht, daß eins davon gemeint ist. Zumindest habe ich keine .jar files von Spring hinzuzufügen.  Außerdem beschreibt der maven-docs Eintrag eine Manifest Datei. (oder ist damit die normale pom.xml gemeint?) Kann mir jemand erklären, was das o.g. Tutorial mit dem Satz für eine Aufgabe stellt? 

Vielen Dank!

Mit besten Grüßen
von Spotz


----------



## mrBrown (10. Sep 2021)

von Spotz hat gesagt.:


> Ich wollte dieses Tutorial hier durchgehen https://usha-dewasi.medium.com/service-registry-using-spring-cloud-netflix-eureka-cba573c693b und bleibe am Anfang bei


Direkt nach dem Satz gibt es doch ein Beispiel, zwar also Screenshot des Codes, aber das Konzept sollte doch klar sein.


"dem classpath hinzufügen" meint in dem Tutorial nicht mehr, als es den (normalen) Dependencies hinzuzufügen.


----------



## Mart (10. Sep 2021)

ich würde dir raten eine IDE als Neuling zu benutzen

zb aus diesem grund in Eclipse
_> maven projekt erzeugen -> pom.xml doppelklicken -> dependency aus der maven website kopieren

andere IDEs: Intellij und VIEEEEEEEEle mehr
mit dem Classpath ganz am anfang rum zu spielen könnte kontra produktiv sien da man da kein erfolgs Erlebnis hat


----------



## mrBrown (10. Sep 2021)

Mart hat gesagt.:


> ich würde dir raten eine IDE als Neuling zu benutzen


Da ist doch weder eine Info, ob eine IDE benutz wird, noch würde die in diesem Fall auch nur das geringste bringen?

(als "Neuling" wäre es aber ratsam, auf Spring zu verzichten...)


----------



## von Spotz (10. Sep 2021)

mrBrown hat gesagt.:


> Direkt nach dem Satz gibt es doch ein Beispiel, zwar also Screenshot des Codes, aber das Konzept sollte doch klar sein.
> 
> 
> "dem classpath hinzufügen" meint in dem Tutorial nicht mehr, als es den (normalen) Dependencies hinzuzufügen.


Hallo mrBrown, 
danke erstmal für die Antwort.

Naja, als Neuling kann man eben schwer zwischen Redensart und Entität unterscheiden. Und es ist schade, wenn man dann an einer solchen blossen Redensart hängen bleibt, weil man davon ausgeht, daß dies ein feature von Maven ist. Ich bin ja in dem Irrglauben durch die beiden genannten links sichtbar bestärkt worden, daß es eine besondere Art von "classpath dependencies" gibt.

Aber kannst Du mir vielleicht noch erklären, was 
a) das dependencyManagement tag macht
und b) was im Kontext von Spring ein "Starter" ist ?

Was es nun mit parent und children auf sich hat, werde ich auch noch herausfinden müssen, sowie ein paar andere Sachen. Aber ich wäre schon einmal froh, wenn der Build von dem Tutorial klappen würde und ich die verwendeten tags verstehen würde.

Vielen Dank!

Mit besten Grüßen
Maximilian von Spotz


----------



## von Spotz (10. Sep 2021)

mrBrown hat gesagt.:


> Da ist doch weder eine Info, ob eine IDE benutz wird, noch würde die in diesem Fall auch nur das geringste bringen?
> 
> (als "Neuling" wäre es aber ratsam, auf Spring zu verzichten...)


Ich benutze Eclipse. Ich werde mir auch noch andere IDEs angucken. Netbeans, IntelliJ, ... Und früher gab es mal eine Java REPL. Ich weiß nicht, ob es das Projekt immer noch gibt. Wäre auch zum Testen nochmal interessant. Eigentlich komme ich von Ruby. Da gibt es den wunderbaren Ruby Version Manager.  In Eclipse scheint es etwas ähnliches zu geben mit sonatype, jfrog, ... ? Einen repository manager ? Wäre halt interessant zu erfahren, wo Eclipse die heruntergeladenen dependencies speichert. Aber das ist nicht die Problemdomäne von diesem Thread.


----------



## von Spotz (10. Sep 2021)

von Spotz hat gesagt.:


> Ich benutze Eclipse. Ich werde mir auch noch andere IDEs angucken. Netbeans, IntelliJ, ... Und früher gab es mal eine Java REPL. Ich weiß nicht, ob es das Projekt immer noch gibt. Wäre auch zum Testen nochmal interessant. Eigentlich komme ich von Ruby. Da gibt es den wunderbaren Ruby Version Manager.  In Eclipse scheint es etwas ähnliches zu geben mit sonatype, jfrog, ... ? Einen repository manager ? Wäre halt interessant zu erfahren, wo Eclipse die heruntergeladenen dependencies speichert. Aber das ist nicht die Problemdomäne von diesem Thread.


Ich würde mir für die dependency Verwaltung prinzipiell eher ein command-line tool wuenschen, statt dem Marketplace.


----------



## kneitzel (10. Sep 2021)

Mit dependencyManagement kannst Du z.B. in einem parent POM schon gewisse Dinge festlegen. Wenn ich mehrere Module habe, dann will ich die Versionen nur an einer Stelle erfassen, daher gibt es dann in pluginManagement und dependencyManagement die Plugins bzw. Dependencies. In den jeweiligen Modulen muss dann z.B. keine Version mehr angegeben werden. 

Wenn Du Dich mit Spring beschäftigst, dann kannst Du einfach mal ein Projekt erzeugen auf start.spring.io und dann die Dependencies anschauen: In den Dependencies hast Du keine <version>...</version> Angaben. Denn das wird im parent POM alles bereits festgelegt. (Die referenzierte POM kann man sich ja auch mal anschauen - die findet sich auch auf https://mvnrepository.com/ zum herunterladen.

Das Konzept hinter Spring Boot Starters ist ähnlich. Da wird einfach in einem POM einiges an Abhängigkeiten zusammen gefasst. Dadurch musst Du weniger angeben. Siehe dazu z.B. auch https://www.baeldung.com/spring-boot-starters


----------



## von Spotz (10. Sep 2021)

kneitzel hat gesagt.:


> Mit dependencyManagement kannst Du z.B. in einem parent POM schon gewisse Dinge festlegen. Wenn ich mehrere Module habe, dann will ich die Versionen nur an einer Stelle erfassen, daher gibt es dann in pluginManagement und dependencyManagement die Plugins bzw. Dependencies. In den jeweiligen Modulen muss dann z.B. keine Version mehr angegeben werden.
> 
> Wenn Du Dich mit Spring beschäftigst, dann kannst Du einfach mal ein Projekt erzeugen auf start.spring.io und dann die Dependencies anschauen: In den Dependencies hast Du keine <version>...</version> Angaben. Denn das wird im parent POM alles bereits festgelegt. (Die referenzierte POM kann man sich ja auch mal anschauen - die findet sich auch auf https://mvnrepository.com/ zum herunterladen.
> 
> Das Konzept hinter Spring Boot Starters ist ähnlich. Da wird einfach in einem POM einiges an Abhängigkeiten zusammen gefasst. Dadurch musst Du weniger angeben. Siehe dazu z.B. auch https://www.baeldung.com/spring-boot-starters


Vielen Dank für die freundliche und umfassende Antwort. In Module und parent/child relationships (https://howtodoinjava.com/maven/maven-parent-child-pom-example/) muß ich mich noch einlesen.

Alles Gute
von Spotz


----------



## kneitzel (10. Sep 2021)

Das Thema ist auch nicht sonderlich komplex finde ich. Aber es ist sehr wichtig, denn darauf basiert extrem viel bei Maven.

Das ist ähnlich wie bei Klassen: Alles erbt von etwas. Und wenn nicht explizit von einer Klasse abgeleitet wird, dann erbt die Klasse von Object.
Bei Maven ist dies dann das Super POM. 

Das ist wichtig, denn es gilt ein Grundsatz:
Convention over Configuration

Es wurden viele grundlegenden Dinge festgelegt und so lange Du Dich an diese "Convention" halten willst, musst Du nichts konfigurieren.
Bestes Beispiel:
`<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>`

Das kann man also sehr schön nutzen.

Ich selbst mag aber diese Parent POM nicht wirklich. Ich weiss nicht, ob ich da eine Ausnahme bin, aber bei mir fliegen die Spring Parent POM immer raus. Hintergrund ist, dass ich Herr über mein Projekt sein möchte. Bei jedem Update muss ich sonst die ganze POM vergleichen, was sich da alles ändert. Da sind dann plötzliche Plugins anders konfiguriert oder so. (Am Anfang würde ich Dir das nicht raten - ganz klar. Bleib erst einmal dabei und erspare Dir die Arbeit die sowas mit sich bringt!)

Diese Starter Abhängigkeiten sind aber etwas anderes. Da geht es rein um Abhängigkeiten und durch eine Startet Abhängigkeit bekommt man auch transitive Abhängigkeiten. Das ist etwas wie bei Linux Distributionen die Meta Pakete. Man installiert dann nur ein meta-Paket und das macht eigentlich nichts. Es kommen nur eben die ganzen Abhängigkeiten mit. Das kann zwar auch Probleme bereiten aber das ist deutlich einfacher zu handhaben (finde ich).

Das einfach noch als zusätzliche Erläuterung.


----------



## von Spotz (10. Sep 2021)

Kleine Frage noch. Wie und wo in dem Projektbaum erstelle ich die application.yml aus dem Turorial? Möchte mir das noch jemand freundlicherweise verraten? (IDE ist wie gesagt Eclipse)

Vielen Dank im Voraus!


----------



## kneitzel (10. Sep 2021)

Das ist eine einfache Text-Datei die JSON zur Konfiguration beinhaltet. Die Konfiguration, die beim Start der App aktiv sein sollte, sollte einfach in den Ressourcen liegen (src/main/resources/). Wenn Du eine Konifguration für Tests hast, die davon abweichen soll, dann sollte diese unter src/test/resources liegen.

Siehe ansonsten auch https://docs.spring.io/spring-boot/.../features.html#features.external-config.files
Da wird halt gezeigt, wo es gesucht wird, aber die resourcen sind ja im classpath und da wird gesucht.


----------



## von Spotz (11. Sep 2021)

kneitzel hat gesagt.:


> Das ist eine einfache Text-Datei die JSON zur Konfiguration beinhaltet. Die Konfiguration, die beim Start der App aktiv sein sollte, sollte einfach in den Ressourcen liegen (src/main/resources/). Wenn Du eine Konifguration für Tests hast, die davon abweichen soll, dann sollte diese unter src/test/resources liegen.
> 
> Siehe ansonsten auch https://docs.spring.io/spring-boot/.../features.html#features.external-config.files
> Da wird halt gezeigt, wo es gesucht wird, aber die resourcen sind ja im classpath und da wird gesucht.


Hallo kneitzel!
In Eclipse scheint es keine Möglichkeit zu geben, eine yml (oder auch JSON Datei) in src/main/resources hinzuzufügen, oder etwa doch? Also muß ich die Datei manuell anlegen?


----------



## von Spotz (12. Sep 2021)

von Spotz hat gesagt.:


> Hallo kneitzel!
> In Eclipse scheint es keine Möglichkeit zu geben, eine yml (oder auch JSON Datei) in src/main/resources hinzuzufügen, oder etwa doch? Also muß ich die Datei manuell anlegen?


Darf ich die Frage nochmal *bumpen* ? 
Viele Grüße !


----------



## von Spotz (12. Sep 2021)

Ich habe die _application.yml_ jetzt einmal im root directory neben der _pom.xml_ erzeugt.
Aber Eclipse meldet 4 Fehlermeldungen.

Einmal
[CODE lang="java" highlight="11"]Description    Resource    Path    Location    Type
SpringBootTest cannot be resolved to a type    ServiceRegistryApplicationTests.java    /service-registry/src/test/java/com/trenchcode/serviceregistry    line 6    Java Problem

Ich habe die entsprechende Zeile markiert

package com.trenchcode.serviceregistry;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest // Zeile 6
class ServiceRegistryApplicationTests {

    @Test
    void contextLoads() {
    }

}
[/CODE]


Zweitens

[CODE lang="java" highlight="12"]Description    Resource    Path    Location    Type
Test cannot be resolved to a type    ServiceRegistryApplicationTests.java    /service-registry/src/test/java/com/trenchcode/serviceregistry    line 9    Java Problem

package com.trenchcode.serviceregistry;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ServiceRegistryApplicationTests {

    @Test // Zeile 9
    void contextLoads() {
    }

}
[/CODE]

Drittens:

[CODE lang="java" highlight="6"]
Description    Resource    Path    Location    Type
The import org.junit cannot be resolved    ServiceRegistryApplicationTests.java    /service-registry/src/test/java/com/trenchcode/serviceregistry    line 3    Java Problem

package com.trenchcode.serviceregistry;

import org.junit.jupiter.api.Test; // Zeile 3
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ServiceRegistryApplicationTests {

    @Test
    void contextLoads() {
    }

}
[/CODE]

[CODE lang="java" highlight="8"]
Description    Resource    Path    Location    Type
The import org.springframework.boot.test cannot be resolved    ServiceRegistryApplicationTests.java    /service-registry/src/test/java/com/trenchcode/serviceregistry    line 4    Java Problem


package com.trenchcode.serviceregistry;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; // Zeile 4

@SpringBootTest
class ServiceRegistryApplicationTests {

    @Test
    void contextLoads() {
    }

}
[/CODE]

Scheinbar funktioniert das mit dem Markieren der Zeilen nicht. Ich habe stattdessen Kommentare hinter die monierten Zeilen geschrieben.

Die 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.trenchcode</groupId>
    <artifactId>service-registry</artifactId>
    <name>service-registry</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
 
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

 
    <repositories>
        <snapshots>
            <enabled>false</enabled>
           </snapshots>
    </repositories>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```

Vielen Dank

Mit besten Grüßen
von Spotz


----------



## kneitzel (12. Sep 2021)

Also bezüglich dem Anlegen der Datei in Eclipse kann ich nicht viel sagen, da ich Eclipse in der Regel nicht verwende. Aber eine normale Textdatei wird Eclipse auf jeden Fall anlegen können und was anderes ist das ja nicht. (Auch wenn der Text dann gültiges JSON sein muss und das im speziellen im geforderten Format.)

Was die Fehlermeldungen angeht:
Du scheinst da ja auch keinerlei Abhängigkeiten zu JUnit zu haben.

Da würde ich also Abhängigkeiten a.la.

```
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
```

Und

```
<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
```

erwarten. junit.version musst Du aber natürlich entweder als Property setzen oder das ${junit.version} ersetzen. Aktuell ist 5.7.0 oder so (Das ist eine Abhängigkeit, die ich seltener prüfe - also mag veraltet sein!)

@test ist in JUnit, @SpringBootTest kommt durch die spring-boot-starter-test bzw. die transitiven Abhängigkeiten.

Edit: Und ganz vergessen zu erwähnen: Die Application Config gehört - wie in #12 schon gesagt - in den resource Ordner. Und da solltest Du zwei haben - einmal in src/main/resources und einmal in src/test/resources (So Du ein Standard Maven Projekt hast wie es z.B. von Spring Initializr (https://start.spring.io) erzeugt wird. Wenn Du das Projekt durch irgend einen Eclipse Kram erzeugt hast: Wegwerfen und neu generieren! (Da sollten die oben genannten Abhängigkeiten auch korrekt enthalten sein - da bin ich mir doch recht sicher.)

Ansonsten neigt Eclipse dazu, Sourcen und Resourcen alle einfach in src abzulegen (Also Java Sourcen und Resourcen, Produktionscode und Testcode alles zusammen!)


----------



## kneitzel (12. Sep 2021)

Und ich habe gerade mal einfach ein Projekt ohne weitere Abhängigkeiten von Spring Initializer generieren lassen und die Dependencies angeschaut:
Die Abhängigkeit zu spring-boot-starter-test war schon enthalten - die ist also Standard. Und die Abhängigkeit zu JUnit ist unnötig - JUnit 5.7.2 kommt da automatisch mit als Abhängigkeit.


----------



## mrBrown (12. Sep 2021)

kneitzel hat gesagt.:


> Aktuell ist 5.7.0 oder so (Das ist eine Abhängigkeit, die ich seltener prüfe - also mag veraltet sein!)


Seit heute 5.8  (dürfte in den nächsten Tagen dann über Maven verfügbar sein, scheint es dort noch nicht zu geben)


----------



## kneitzel (12. Sep 2021)

mrBrown hat gesagt.:


> Seit heute 5.8  (dürfte in den nächsten Tagen dann über Maven verfügbar sein, scheint es dort noch nicht zu geben)


Hatte etwas mit versions-maven-plugin gespielt (anderer Thread) und da hat er mir das auch schon mit angegeben. Aber ich habe es noch nicht ausprobiert, wobei ich jetzt erwarten würde, dass er das jetzt kann (Denn die Info kommt ja vom maven central repository oder nicht?)

Aber das 5.7.0 war auf jeden Fall veraltet - da wäre ohne die 5.8 auch die 5.7.2. (Das habe ich auch wegen einem anderen Thread gesehen für den ich mir vorsichtshalber den dependency tree einer Spring Boot Applikation angesehen hatte  - finde ich gerade lustig, wie so doch eigentlich unterschiedliche Themen in Threads doch zusammen kommen  )


----------



## mrBrown (12. Sep 2021)

kneitzel hat gesagt.:


> Hatte etwas mit versions-maven-plugin gespielt (anderer Thread) und da hat er mir das auch schon mit angegeben. Aber ich habe es noch nicht ausprobiert, wobei ich jetzt erwarten würde, dass er das jetzt kann (Denn die Info kommt ja vom maven central repository oder nicht?)


Stimmt, gibt's bei Maven Central schon, ist nur in search.maven.org und mvnrepository.com noch nicht indiziert


----------



## von Spotz (13. Sep 2021)

Hallo kneitzel,



kneitzel hat gesagt.:


> Und ich habe gerade mal einfach ein Projekt ohne weitere Abhängigkeiten von Spring Initializer generieren lassen und die Dependencies angeschaut:
> Die Abhängigkeit zu spring-boot-starter-test war schon enthalten - die ist also Standard. Und die Abhängigkeit zu JUnit ist unnötig - JUnit 5.7.2 kommt da automatisch mit als Abhängigkeit.


das ist etwas komisch. Ich habe das Projekt von spring initializr generieren lassen. 

Tut mir Leid, als Anfänger mit dem Buildsystem ist der Schritt von 0 auf 1 wohl der Schwerste. Schwieriger als die Schritte 1 bis 9.

--

Wenn ich jedenfalls die application.yml in src/main/resources mit dem Inhalt

```
server:
  port:8761
 
spring:
  application:
    name:eureka
    
eureka:
  instance:
    hostname: localhost
    
  client:
    register-with-eureka: false
    fetch-registry: false
```

wie in o.g. Tutorial erstellle bekomme ich bei "Run" eine längliche Fehlermeldung


```
.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.8)

2021-09-13 04:06:21.829  INFO 256685 --- [           main] hello.Application                        : Starting Application using Java 11.0.11 on max-Precision-M4800 with PID 256685 (/media/max/KINGSTON/eclipse/workspace2021/spring-boot-docker/target/classes started by max in /media/max/KINGSTON/eclipse/workspace2021/spring-boot-docker)
2021-09-13 04:06:21.832  INFO 256685 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default
2021-09-13 04:06:22.579  INFO 256685 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-09-13 04:06:22.589  INFO 256685 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-09-13 04:06:22.590  INFO 256685 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.48]
2021-09-13 04:06:22.646  INFO 256685 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-09-13 04:06:22.646  INFO 256685 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 763 ms
2021-09-13 04:06:22.936  WARN 256685 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
2021-09-13 04:06:22.939  INFO 256685 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2021-09-13 04:06:22.951  INFO 256685 --- [           main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-09-13 04:06:22.964 ERROR 256685 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.8.jar:5.3.8]
    at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.8.jar:5.3.8]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) ~[spring-boot-2.4.8.jar:2.4.8]
    at hello.Application.main(Application.java:18) ~[classes/:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:229) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.8.jar:5.3.8]
    ... 15 common frames omitted
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:243) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282) ~[spring-boot-2.4.8.jar:2.4.8]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213) ~[spring-boot-2.4.8.jar:2.4.8]
    ... 17 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1075) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:239) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    ... 19 common frames omitted
Caused by: java.net.BindException: Die Adresse wird bereits verwendet
    at java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na]
    at java.base/sun.nio.ch.Net.bind(Net.java:455) ~[na:na]
    at java.base/sun.nio.ch.Net.bind(Net.java:447) ~[na:na]
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) ~[na:na]
    at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:272) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:227) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1208) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1294) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:614) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1072) ~[tomcat-embed-core-9.0.48.jar:9.0.48]
    ... 21 common frames omitted
```

Viele Grüße


----------



## kneitzel (13. Sep 2021)

Das Kernproblem ist bei Dir, dass der Port, den die Applikation verwenden soll, bereits benutzt ist:


> Caused by: java.net.BindException: Die Adresse wird bereits verwendet


Bei einem Stacktrace immer runter gehen bis zur Exception, die alles ausgelöst hat. 

Sprich: Der Port 8761 wird bereits benutzt und daher kannst Du darauf auch nicht mehr Deine Appikation starten.

Bezüglich der fehlenden Abhängigkeit verstehe ich nicht, wieso diese bei Dir gefehlt hat. Ich habe jetzt auch einmal ein Demo Projekt angelegt, das nur den Eureka Server als Abhängigkeit hat:


```
<dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
```

Aber egal wieso es gefehlt hat: Mit dieser Abhängigkeit sollten die fehlenden Klassen dann zur Verfügung stehen. Wenn Du noch mit einer module-info.java arbeiten solltest, dann würden da paar requires rein müssen, aber per default sollte spring initializr die nicht mit erstellen.

Und evtl. noch ein paar Worte zu 


von Spotz hat gesagt.:


> Tut mir Leid, als Anfänger mit dem Buildsystem ist der Schritt von 0 auf 1 wohl der Schwerste. Schwieriger als die Schritte 1 bis 9.


Hier muss dir nichts leid tun. Das ist alles voll in Ordnung und wir wollen Dir gerne helfen. Wenn wir etwas (meinen) zu sehen, dann ist dies nie als Vorwurf zu verstehen! Gerade am Anfang ist es normal, Fehler zu machen und auch Probleme zu haben, diese zu beheben. Manche Fehler mögen "dumm" oder trivial sein, aber das bezieht sich dann nur auf den Fehler und nicht auf Dich. Ich ecke manchmal mit Leuten an wegen so Aussagen, daher ist es mir wichtig, dies noch einmal zu betonen. (Und es ist auch etwas ganz normales: Jeder macht mal "dumme" Fehler, weil er etwas nicht richtig durchdacht hat. Daher wirklich absolut keine Wertung!)


----------



## von Spotz (13. Sep 2021)

Vielen Dank kneitzel.  
Ich kenne auch ein gewisses Angelsächsisches Forum wo Anfänger ziemlich schnell abgebügelt werden.

Leider macht es keinen Unterschied, welchen Port ich wähle. Ich habe jetzt mal port:8552 ausprobiert, aber die Fehlermeldungen bleiben die gleichen.


----------



## kneitzel (13. Sep 2021)

Kannst Du evtl. einmal das Projekt als ZIP einstellen und genau beschreiben, wie Du es testest / ausführst?

Von dem, was ich hier bisher gesehen habe, sieht alles ok aus. Und das entspricht auch etwas dem, was man z.B. bei baeldung als Beispiel hat, wenn man da mit Eureka was machen will: https://www.baeldung.com/spring-cloud-netflix-eureka
Oder direkt bei Spring (dort wird die Config im properties File vorgenommen): https://spring.io/guides/gs/service-registration-and-discovery/

Ich hatte mal kurz überlegt, ob es ein Problem sein könnte, dass der deine Konfiguration nicht lädt, weil es ggf. noch ein leeres application.properties geben könnte (Das im zip des Spring initializr mit drin ist), aber das sollte nicht der Fall sein, denn er sollte laut Dokumentation alle Dateien laden.

Somit sehe ich derzeit keine Gründe, wieso es generell nicht laufen sollte.


----------



## von Spotz (13. Sep 2021)

kneitzel hat gesagt.:


> Kannst Du evtl. einmal das Projekt als ZIP einstellen und genau beschreiben, wie Du es testest / ausführst?
> 
> Von dem, was ich hier bisher gesehen habe, sieht alles ok aus. Und das entspricht auch etwas dem, was man z.B. bei baeldung als Beispiel hat, wenn man da mit Eureka was machen will: https://www.baeldung.com/spring-cloud-netflix-eureka
> Oder direkt bei Spring (dort wird die Config im properties File vorgenommen): https://spring.io/guides/gs/service-registration-and-discovery/
> ...


Guten Morgen!
Ich habe zwei Verzeichnisse. Einmal habe ich das von Spring Initializr erzeugte Paket importiert. Aber scheinbar nicht ganz richtig, weil es sich nicht in meinem Workspace befindet. Und dann habe ich in dem Workspace von Eclipse noch ein Verzeichnis einerseits mit der POM und andererseits mit Dateien, die von Eclipse erzeugt wurden. Soll ich dann nur den Ordner aus der Workbench hochladen? Und kann ich die übers Forum hochladen oder muss ich meinen eigenen FTP benutzen?

Und andere Frage: Wenn ich Deinen in Deinem Link zu baeldung.com wiederum den Link auf https://search.maven.org/classic/#s...rk.cloud" AND a:"spring-cloud-starter-parent" lese und mir die Ergebnisse angucke, wie trifft man denn da eine Auswahl?

Viele Grüße
Maximilian


----------



## kneitzel (13. Sep 2021)

Also ich bin kein Eclipse Spezialist, aber das Projekt sollte schon richtig importiert worden sein. Da werde ich aber im Detail nicht helfen können / Fehler finden und beseitigen können. Also eigentlich solltest Du meiner Meinung nach im Workspace dein Projekt sehen mit pom.xml, src Verzeichnis, ggf. dem maven wrapper (mvnw Scripte und .mvn Verzeichnis) und  dem, was so generiert wird (target Verzeichnis).

Und dann wäre das auch das, was ich als zip erwarten würde (nach einem maven clean Aufruf). Da kann dann von eclipse noch ein .project und .classpath dabei sein oder was auch immer Eclipse da so erstellen möchte.

Eine Sache ist ganz wichtig: So ein Maven Projekt ist komplett. Die IDE sind nur Beiwerk, der prinzipiell jederzeit gelöscht werden kann. Das Projekt kann mit maven immer gebaut werden! (Und das ist für mich eine Sache, die ich regelmäßig auch mache. Bei Problemen stelle ich so sicher, dass es nicht an irgend etwas in der IDE liegt).

Was die Wahl der Version angeht:
Hier sehe ich mehrere Möglichkeiten. Wenn Du ein Projekt mit Spring initializr (https://start.spring.io) erzeugst, dann hast Du keine Version von Dir aus zu wählen. Das Projekt hat dann eine Parent POM bei der Du die Spring Boot Version auswählst. Die ganzen Module kommen dann in der Regel automatisch in der richtigen Version. Das ist bei Eureka aber nicht wirklich so, denn da geht es nicht um ein Spring Modul sondern ist eine externe Abhängigkeit.
Und da ist dann der andere Weg wichtig: Man muss sich anschauen, was für Release es gibt. Man greift in der Regel zu der letzten stabilen Version. Welche das hier genau ist, weiss ich nicht. Da hilft ansonsten einfach die Homepage des jeweiligen Projekts das dann auch die Release Notes veröffentlicht und so.

Das ist aber in der Regel auch nicht ganz so entscheidend. Gerade am Anfang muss man nicht zwingend immer die letzte Version nutzen.


----------



## von Spotz (13. Sep 2021)

Woraus setzt sich denn der Versionsname zusammen?
Zum Beispiel Greenwich.SR3 oder Hoxton.SR12 oder einfach nur eine Jahreszahl und zwei weitere durch Punkt getrennt wie 2020.0.1 ? Ok, das Datum steht da, aber hat das semantisch irgendwas zu bedeuten? Und wofür ist SR die Abkürzung, wenn ich fragen darf?


----------



## von Spotz (13. Sep 2021)

Hallo Kneitzel, ich habe Dir eine PN geschickt.


----------



## kneitzel (13. Sep 2021)

SR würde ich jetzt raten: Service Release. Aber was da die Namen jeweils bedeuten, da muss man man die Entwickler fragen. Und bei Spring Cloud ist das relativ gut dokumentiert: https://spring.io/projects/spring-cloud
Hier wurden einfach Namen für Major Releases eingeführt. Greenwich ist der Spring Boot 2.1.x teil (Willst Du nicht)
Hoxton ist der Spring Boot 2.2 und 2.3 Name. -> Willst Du nicht!
2020.0.x / Ilford -> Das ist der Versionszweig für Spring Boot 2.5 und das willst Du, da Du Spring Boot 2.5.4 nutzt.

Normalerweise sind das einfache Versionsnummern. Also sowas die 2.5.4
Dazu gibt es dann oft Anhänge - üblich ist z.B. -SNAPSHOT. 2.5.4-SNAPSHOT ist die Entwicklung hin zu 2.5.4 - Also es ist noch nicht fertig und nur ein Snapshot der Entwicklung der Version 2.5.4
Oft sieht man sowas wie -BETA -BETA1 -M1 ... Das sind dann alles Veröffentlichungen, die noch nicht final sind (aber natürlich schon genutzt werden können). 

Wenn man sich die Spring Entwicklung anschaut, dann sieht man bei Spring Initializr derzeit:
2.5.4 -> aktuelle Version
2.4.10 -> letzte stable Version der 2.4er Reihe.
2.4.11 (SNAPSHOT) -> Das wird mal die neue 2.4.11 ... aber die ist noch nicht fertig. Kannst Du testen um dann ggf. Bugs zumelden oder so.
2.5.5 (SNAPSHOT) -> wie bei 2.4.11 nur eben wird das die nächste 2.5er Version
2.6.0 (M2) -> das ist der zweite Milestone hin zur 2.6er Version.
2.6.0 (SNAPSHOT) -> aktuelle Entwicklung
Unterschied SNAPSHOT vs Milestone: Snapshot ist ein einfacher Zwischenstand, der nach einem commit / push gebaut wird. Ein Entwickler baut Sch,..., dann hast Du da eine nicht funktionierende Version. --> Also wirklich nur Testzwecke!
Milestone wird genau drauf geachtet, was drin ist. Es hat ein Release Prozess stattgefunden. Tests laufen, sieht gut. Wenn du also schon Features von 2.6 brauchst, dann nimm den Milestone.


----------



## kneitzel (13. Sep 2021)

von Spotz hat gesagt.:


> Hallo Kneitzel, ich habe Dir eine PN geschickt.


Ja danke, ich habe es mir schon angesehen. Incls. der Vermutung, dass Du ggf zwei Spring Boot Applikationen startest. Die zwei SprinBootApplication Klassen solltest Du zumindest nicht haben, denn das führt auch dazu, dass die Tests nicht mehr laufen.


----------

