Jestem stosunkowo nowy w mantrze Maven, ale próbuję zbudować słoik uruchamiany z wiersza poleceń z Mavenem. Skonfigurowałem zależności, ale kiedy uruchamiam mvn install
i próbuję uruchomić jar, dzieją się dwie rzeczy. Po pierwsze, nie znaleziono żadnej klasy głównej, którą można poprawić. Kiedy to poprawiłem, podczas uruchamiania pojawiają się błędy informujące, że nie można znaleźć klas.
Maven nie pakuje moich bibliotek zależności wewnątrz jar, więc nie mogę uruchomić jar jako samodzielnej aplikacji. Jak to poprawić?
java
maven-2
build-process
executable-jar
Stefan Kendall
źródło
źródło
Odpowiedzi:
Najłatwiejszym sposobem byłoby utworzenie zestawu przy użyciu
maven-assembly-plugin
predefiniowanegojar-with-dependencies
deskryptora i. Będziesz także musiał wygenerować manifest z wpisem klasy głównej dla tego jar Uber. Poniższy fragment kodu pokazuje, jak skonfigurować wtyczkę zespołu, aby to zrobić:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
Następnie, aby wygenerować zestaw, po prostu uruchom:
mvn assembly:assembly
Jeśli chcesz wygenerować zestaw jako część swojej kompilacji, po prostu
assembly:single
połącz mojo z fazą pakietu:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
I po prostu uruchom:
mvn package
źródło
assembly:assembly
Celem jest przestarzałaMaven nie pakuje zależności w Twoim pliku jar, ponieważ zazwyczaj nie robisz tego w programach Java.
Zamiast dostarczyć zależności razem z plikiem jar i wymienić je w
Class-Path
nagłówku manifest .Aby przejść tę trasę, musisz włączyć
addClasspath
właściwość (udokumentowaną tutaj ) dlamaven-jar-plugin
.Jeśli naprawdę chcesz uwzględnić wszystkie zależności w pliku jar, możesz użyć wtyczki Maven Assembly, aby utworzyć plik
jar-with-dependencies
.źródło
To właśnie zrobiłbym dla małych projektów. W większości przypadków nie chcesz jednego dużego słoika.
zbudować: mvn clean dependency: copy-dependencies pakiet
do wykonania ( w katalogu docelowym ): java -cp myjar.jar: ./ dependency / * com.something.MyClass
źródło
Zgadzam się z Joachimem Sauerem,
Zamiast używać jar-with-dependency, powinieneś skonfigurować wtyczkę jar w taki sposób, jak w pom.xml:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> <mainClass>[mainClassFullName]</mainClass> </manifest> <manifestEntries> <mode>development</mode> <url>${project.url}</url> <key>value</key> </manifestEntries> </archive> </configuration> </plugin>
I użyj tej konfiguracji zestawu, aby dodać zależności jar do swojego zestawu:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>zip-with-jars</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <unpack>false</unpack> <scope>runtime</scope> </dependencySet> </dependencySets> </dependencySets> </assembly>
źródło
Po prostu dodaj poniższy kod w pom.xml i uruchom jako: maven: install. Jar zostanie utworzony w folderze docelowym eclipse, którego można użyć jako „java -jar Hello.jar”. ale upewnij się, że nazwa klasy głównej to com.abc.HelloWorld.java
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-shade-plugin</artifactid> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalname>HelloW</finalname> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestentries> <main-class>com.abc.HelloWorld.java</main-class> <build-number>1</build-number> </manifestentries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
źródło