Jak utworzyć samodzielną aplikację z niezmienionymi zależnościami za pomocą Maven?
Mam aplikację Java na komputery stacjonarne zbudowaną przy użyciu Maven 2 (ale mogę to zaktualizować do Maven 3, jeśli to pomoże) z wieloma zależnościami typu open source. Teraz próbuję spakować go jako samodzielny, aby udostępnić go użytkownikom końcowym bez konieczności instalowania Maven lub czegokolwiek innego.
Z powodzeniem użyłem wtyczki maven-assembly do zbudowania pojedynczego słoika zawierającego wszystkie zależności, ale tak naprawdę nie jest to, czego chcę, ponieważ podczas korzystania z bibliotek LGPL masz na celu redystrybucję bibliotek, których używasz jako oddzielnych słoików.
Chcę, żeby Maven zbudował zamek zawierający słoik z moim kodem iMANIFEST.MF
to odnosi się do innych słoików, których potrzebuję razem z innymi słoikami. Wydaje się to standardową praktyką, ale nie widzę, jak to zrobić.
Oto wyciąg z mojego pom
<code> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <compilerVersion>1.6</compilerVersion> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-Dfile.encoding=UTF-8</argLine> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.company.widget.Main</mainClass> <packageName>com.company.widget</packageName> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.company.widget.Main</mainClass> <packageName>com.company.widget</packageName> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </code>
EDYCJA: Zrobiono na pomysł Kals
utworzył plik o nazwie descriptor.xml
<code><?xml version="1.0" encoding="UTF-8"?> <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>distribution</id> <formats> <format>zip</format> </formats> <dependencySets> <dependencySet> <scope>runtime</scope> <outputDirectory>lib</outputDirectory> <unpack>false</unpack> </dependencySet> </dependencySets> </assembly> </code>
a pom zawiera:
<code><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> <archive> <manifest> <mainClass>com.company.widget.cmdline.Main</mainClass> <packageName>com.company.widget</packageName> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </code>
Teraz utrzymuje jar i umieszcza je wszystkie w folderze lib, włącznie z moim własnym kodem