Stránka 1 z 1

Přidání závislosti do Java projektu

Napsal: 13 říj 2022 15:07
od Serg01
Zdravím, potřeboval bych použít GraphHopper class, ale nějak se mi nedaří spustit package z jejich examplu.

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
vytvoří target/graphhopper-example-7.0-SNAPSHOT.jar (a nevypíše žádné chyby/varování), který když zkusím pustit pomocí:

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 :D
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? :D
Nebo to spouštím špatně a měl by se ten výsledný .jar spouštět jinak?

Re: Přidání závislosti do Java projektu

Napsal: 14 říj 2022 15:20
od Clorky
Ahoj, co používáš za IDE? V IntelliJ normálně nakopíruješ dependency, kterou potřebuješ, do pom.xml a zbuildíš. Zapínáš pak normálně přes run.
K hledání těch dependecies se používá https://search.maven.org/.

Re: Přidání závislosti do Java projektu

Napsal: 18 říj 2022 17:54
od Serg01
A jo, IDE, to mě nenapadlo :D Takže jsem to psal v Kate (editor v Kubuntu) a kompiloval/spouštěl v konzoli.
Jel jsem podle tohodle návodu: https://maven.apache.org/guides/getting ... nutes.html, tam se o žádném IDE nezmiňují :D

Re: Přidání závislosti do Java projektu

Napsal: 20 říj 2022 22:04
od Clorky
Tak na to se vykašli. Rozjeď si nějaké rozumné IDE, v texťáku a konzoli se nedá rozumně fungovat, kor když rozjíždíš něco takového.
Osobně na Javu doporučuji právě IntelliJ. Jinak hodně lidí miluje Visual Studio Code. To je editor, který si můžeš nabouchat libovolnými doplňky a používat jej nejen na Javu, ale na cokoliv.