Maven install eigenes jar einbinden

Hallo zusammen,

Ich habe 2 projekte. Projekt b hat projekt a als dependecie. Läuft lokal auch gut. Nur wenn ich mvn install mache und die jars auf dem server installieren will, findet es die kalssen aus Projekt b nich, welche in a abhängikeit haben. Mir scheint als würde die jar vom projekt a, nicht in projekt b eingebaut werden.

Hat jemand eine idee wo ich suchen muss?

Dafür brauchst du das maven-assembly-plugin. Das kann dir eine jar bauen, die alle dependencies drinne hat.

Wo liegt denn die dependency? Wenn die in der Maven Central liegt, passiert alles automatisch. Wie Zauberei. Wenn die dependency ein eigenes Projekt ist, muss man erst auf der dependency mvn install machen, damit die im lokalen Maven Repo liegt, und danach funktioniert auch das mvn install von dem Projekt, das die dependency zur vorher installierten lib hat.

(Je nachdem, worum es genau geht, gibt’s auch etliche andere Lösungen. Eine uber-JAR, die alle dependencies enthält, ist aber in vieler Hinsicht problematisch @Tomate_Salat : Wenn die installiert ist, findet er ggf. Klassen doppelt. Von der Versionierungsfrage mal ganz abgesehen… Für’s finalste deployment ist aber eine über-JAR mit allen dependencies (am besten direkt startbar) aber natürlich am praktischsten…)

danke sehr. habe das abhängige Projekt zuerst gebaut und dann das andere wo die dependencies drin ist, aber das klappt nicht

java.lang.TypeNotPresentException: Type com.model.User not present

mit dem assembly plugin ebenfalls nicht, aber hab das jetzt nur kurz in die pom genommen und neu Install gemacht, da muss bestimmt noch was konfiguriert werden das schaue ich mir später nochmal an

Ja, da musst du mehr machen. Das Plugin muss konfiguriert werden. Aber nicht einfach copy-paste! Du musst schon noch deine Main-Klasse angeben [ich die entsprechende Stelle mit einem Kommentar versehen]:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>create-executable-jar</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>

            <configuration>
                <finalName>${artifactId}</finalName> <!-- optional -->
                <appendAssemblyId>false</appendAssemblyId> <!--- optional -->

               <!-- Das nachfolgende ist wichtig! -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>

                <archive>
                    <manifest>
                        <mainClass>HIER KOMMT DEINE MAIN REIN (z.B. de.sample.AppStarter)</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

Dann erhälst du aber 2 Jars. Die andere kannst du los werden, indem du das maven-jar-plugin aus dem lifecycle ausschließt:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>

    <executions>
        <execution>
            <id>default-jar</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>
1 „Gefällt mir“

Nicht bei mir. Eben nochmal ausprobiert in meinem Dummy-Projekt. Ohne das assembly-Plugin mit aktivem maven-jar-plugin landet da nur mein Code in der erstellten Jar.

Nun ja, dependencies excluden dürfte dann schwierig werden. Sollte halt nicht unbedingt mit libs passieren. Aber eine Endanwendung hat man doch eher seltener als Abhängigkeit (würde ich jetzt mal behaupten). [Wobei ich mir auch nicht sicher bin, ob wirklich diese jar dann installiert wird. Aber das kann man ja nachprüfen EDIT: Ja es wird installiert]

Das bezog sich darauf, dass ein mvn install funktioniert, wenn entweder vorher auf allen dependencies mvn install gemacht wurde, oder die dependencies in der Maven Central liegen. Für eine über-JAR braucht man natürlich noch das assembly-Plugin (wobei das IIRC vom “shade-plugin” überholt wurde … aber beide haben so ihre Tücken…)

bekomm ich nicht hin, bin scheinbar zu dämlich für maven.

Der built dauert gefühlt stunden, so lange warte ich gar nicht erst bis er fertig ist. gibts mit spring boot eine alternative?

Ehrlich gesagt kann ich das nicht nachvollziehen.

Ich nehme maven und habe die Abhängigkeiten definiert.

Anschließend sage ich, was ich bauen will und dann kommt genau ein Artefakt mit allen Abhängigkeiten raus.

Das muss aber gesagt werden, da sonst man die Abhängigkeiten manuell in den classpath bekannt geben muss.

Hier fehlt mir definitiv ein kleines kompilierbares Projekt mit den poms des to. Ansonsten kann man hier nur raten.

Und die Frage nach spring Boot ist für mich einfach so: ich schmeiße mal ne Vokabel rein, damit der Post komplizierter wird.

Das wäre ein interessantes Detail gewesen (oder hab ichs verpasst?). Für Spring-Boot brauchst du das assembly-plugin nicht. Spring-Boot bringt sein eigenes mit.

Poste am besten mal deine pom.xml

Das mit “gefühlt Stunden” könnte auch weiter geklärt werden. Wie lange dauert was? 30 Sekunden für das Zusammenpacken der JAR? Oder 120 Minuten für das clean?

Der built dauert über 5 Minuten mit dem Assembly plugin. ohne paar Sekunden. Hier ist meine POM, darin ist deine Dependency “entität-service” das das Projekt was mit rein soll. Lokal wie gesagt alles iO, aber remote meckert es, dass die Klassen nicht gefunden werden. Manuell dem Classpath hinzufügen geht auch.

Muss ich noch ein repository hinzufügen?

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>com.mydomain</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>user-service</name>
<description>Demo project for Spring Boot</description>

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.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.8</java.version>
	<spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.version>
</properties>

<dependencies>

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>runtime</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>com.mydomain</groupId>
		<artifactId>entity-service</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-assembly-plugin</artifactId>
		<version>3.1.0</version>
	</dependency>
</dependencies>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
	<finalName>${project.name}</finalName>
</build>

<repositories>
	<repository>
		<id>spring-snapshots</id>
		<name>Spring Snapshots</name>
		<url>https://repo.spring.io/snapshot</url>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
	</repository>
	<repository>
		<id>spring-milestones</id>
		<name>Spring Milestones</name>
		<url>https://repo.spring.io/milestone</url>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
</repositories>

Ähm ja. Wozu haust du das spring-boot-plugin rein, wenn du nix mit machst -> das kannst du direkt wieder rausnehmen. Sollte out-of-the-box richtig konfiguriert drin sein, dank dem Spring-boot-parent.

Und die maven-assemply-plugin-dependency kannst du auch wieder raushauen. Naja - aber wie gesagt: wegen spring-boot solltest du das assembly-plugin eh nicht benötigen. Von daher egal, dass du mein Beispiel offensichtlich komplett ignoriert hast oO.

1 „Gefällt mir“

danke dir, test ich nochmal ohne das Plugin. Dein Beispiel hab ich nicht irgnoriert, dass uist in einem anderen Testprojekt versucht worden. Also sollte das Out of the Box mit den Abhängigkeiten funktionieren? Hm ich meld mich dann nach dem Testen ohne Spring-Boot-Plugin nochmal.

klappt leider nicht :frowning: dann ist das jar nur 8KB groß. Irgendwas stimmt jetzt nicht mehr
Edit: clean gemacht nun ist sie wieder au 50MB und mein jar ist enthalten.

Das

org.springframework.boot spring-boot-maven-plugin

ist automatisch drin, wenn ich auf start.spring.io ein Projekt erstelle

Ja, das kommt von dem spring-boot-parent. Der gibt dir eine ordentliche Basiskonfiguration mit.