Stáhnul jsem zdrojový kód z https://github.com/graphhopper/graphhopper, z toho jsem si vytáhnul složku example, vlezl do ní a nechal zkompilovat mavenem.
(musel jsem teda ještě v pom.xlm upravit verzi závislosti na graphhopper-core z 7.0-SNAPSHOT na 6.0, která je k dispozici v maven repozitáři)
Kód: Vybrat vše
mvn package
Kód: Vybrat vše
java -cp target/graphhopper-example-7.0-SNAPSHOT.jar com.graphhopper.example.RoutingExample
Tak dostanu chybu:
Error: Unable to initialize main class com.graphhopper.example.RoutingExample
Caused by: java.lang.NoClassDefFoundError: com/graphhopper/GraphHopper
Na stackoverflow jsem četl, že to může způsobit také chybějící dependency. Když jsem zakomentoval většinu obsahu v RoutingExample.java, a nechal jsem tam jen
Kód: Vybrat vše
public class RoutingExample {
public static void main(String[] args) {
System.out.println("Hello");
}
// zbytek zakomentovany
}
Tak to po zkompilovaní a spuštění výše zmíněným příkazem vypsalo do konzole to Hello.
Ale jakmile jsem začal postupně odkomentovávat, a dostal jsem se k funkci, která jako parametr vyžaduje objekt typu GraphHopper
Kód: Vybrat vše
public static void routing(GraphHopper hopper) { ...
(který by měl být definovaný v té závislosti graphhopper-core), tak to zase začalo vypisovat tu chybu java.lang.NoClassDefFoundError.
Mimochodem, když jsem měl jen ten výpis "Hello" a odkomentované všechny importy, tak to pořád fungovalo, takže importy tu chybu nezpůsobují.
Výsledný graphhopper-example-7.0-SNAPSHOT.jar má jen 13kB, přitom graphhopper-core-6.0.jar (stažený z https://mvnrepository.com/artifact/com. ... r-core/6.0) má 1.6 MB, ale nikde ve složce target nemůžu najít, že by tam maven vložil tu knihovnu. Jak se má správně do Javy přidat další .jar soubor, ze kterého bych chtěl používat některé třídy?
Dodatečně přidáno po 1 hodině 4 minutách 48 vteřinách:
Tak se mi to podařilo nakonec na základě 2 témat na stackoverflow dát dohromady
První poradil jak donutit maven, aby ty závislosti přidal do target složky, druhý poradil jak říct mavenu, aby vytvořil MANIFEST.MF, ve kterém specifikuje hlavní třídu, ze které se má .jar spouštět, a classpath, což vypadá na seznam těch závislostí, které bude ten můj .jar potřebovat.
Takže jsem přidal do pom.xml tenhle kus kódu, a už to funguje.
Kód: Vybrat vše
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.graphhopper.example.RoutingExample</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
A spouštím to už tímto příkazem (jelikož to už má v sobě manifest):
Kód: Vybrat vše
java -jar target/graphhopper-example-0.1.jar
Akorát nechápu proč to musí člověk takle složitě dohledávat a proč to maven nedělá automaticky - když je snad přeci jasný, že pokud zadám nějakou závislost, tak ji asi budu potřebovat po zbuildění, abych to mohl pustit, ne?
Nebo to spouštím špatně a měl by se ten výsledný .jar spouštět jinak?