[KOTLIN] hoe jar file includen in build?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Mijn vraag
...

Relevante software en hardware die ik gebruik:
linux
kotlinc
kotlin
...

Wat ik al gevonden of geprobeerd heb:
Met intellij werkt het, echter met kotlinc werkt het niet
...

Ik probeer een jar file te maken en dan te runnen in linux. In intellij werkt dit, hij maakt een jar file, en die kun je dan als volgt runnen:
java -jar program.jar

Nu doe ik op de commandline het volgende:
kotlinc Main.kt -include-runtime -cp jsoup-1.16.1.jar -d t.jar

Er ontstaat dan een jar file met de naam "t.jar".

Echter kan ik deze file niet runnen met:
java -jar t.jar

Want dan komt de foutmelding:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at MainKt.main(Main.kt:14)
at MainKt.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 2 more


als ik kijk wat er in de t.jar zit zie ik geen jsoup:
jar tf t.jar | grep -i jsoup

Het lijkt er dus op dat de jsoup-1.16.1.jar niet meegenomen is met het compileren.

Iemand enig idee hoe je die jsoup-1.16.1.jar mee kunt nemen met het compileren, dat wil zeggen hoe je die in t.jar kunt krijgen?

of zit er een fout in het volgende commando?
kotlinc Main.kt -include-runtime -cp jsoup-1.16.1.jar -d t.jar

De computer compileert wel maar lijkt de jsoup-bestanden niet toe te voegen aan t.jar. Intellij doet dat wel en daarom kan het jar-bestand gewoon worden uitgevoerd met > java -jar bestand.jar

Lucht en leegte, zegt Prediker, alles is leegte.

Beste antwoord (via Salvatron op 17-10-2023 13:48)


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 07-06 14:56
Salvatron schreef op maandag 16 oktober 2023 @ 19:46:
[...]


java -cp jsoup-1.16.1.jar -jar t.jar
java -cp ./jsoup-1.16.1.jar -jar t.jar

werken niet (jsoup...jar staat gewoon in dezelde directory)
Ik heb het lokaal even nagespeeld en je hebt helemaal gelijk. Blijkbaar moet ik zelf ook even terug naar de schoolbanken wat betreft classpath gebruik en java. Te verwend de afgelopen jaren door alles voor mij op te laten lossen door gradle, spring en IntelliJ.

De oorzaak lijkt te zijn dat als je -jar gebruikt, de -cp optie genegeerd wordt door java (stackoverflow zegt immers dat dat zo is). Blijkbaar moet de jar dan alles bevatten inclusief alles wat op het classpath zit of referenties op het classpath. Heb ik ook weer wat geleerd vandaag!

Dus in jou geval zou het volgende wel moeten werken met de aanname dat het bestand waar je main methode in staat ook `Main.kt` heet als filename en niet in een package zit:
code:
1
java -cp "soup-1.16.1.jar:t.jar" MainKt

Dus alle libraries die je hebt gescheiden door een dubbele punt op een rijtje in het classpath, en daarna de main class die gestart moet worden compleet met package names en alles.


Maar het moge duidelijk zijn dat dit niet heel fijn werken is. Jsoup is gelukkig een kleine dependency die zelf geen verdere dependencies nodig heeft, maar sommige andere dependencies hebben echt een enorme boom structuur aan andere dependencies die ze zelf weer nodig hebben. Dan wordt dit handwerk al snel onwerkbaar.
Gradle of maven de dependencies laten downloaden, managen en uiteindelijk een fat jar laten bouwen is wel toekomstvaster als je ooit nog andere dependencies nodig hebt, maar geen idee hoeveel ambities je hebt met dit project :)

Alle reacties


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Op basis waarvan denk je dat jsoup toegevoegd wordt?

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
armageddon_2k1 schreef op maandag 16 oktober 2023 @ 13:43:
Op basis waarvan denk je dat jsoup toegevoegd wordt?
De jar-file die intellij genereert is 6,6 M groot.
De jar-file die kotlinc genereert is 4,8 M groot.

Ook doe ik dit bij de intellij-jar-file:

jar tf jsoup2.jar | grep -i jsoup

en de konsole geeft een lange lijst met o.a. dit:

META-INF/jsoup2.kotlin_module
org/jsoup/
org/jsoup/nodes/
org/jsoup/internal/
org/jsoup/parser/
org/jsoup/safety/
org/jsoup/select/
org/jsoup/helper/
META-INF/maven/org.jsoup/
META-INF/maven/org.jsoup/jsoup/
org/jsoup/SerializationException.class
org/jsoup/Connection.class
org/jsoup/nodes/FormElement.class
org/jsoup/nodes/Attributes$Dataset$EntrySet.class

etc, etc...

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Ik bedoel, waarom zou je denken dat ie middels je kotlinc toegevoegd wordt?

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
armageddon_2k1 schreef op maandag 16 oktober 2023 @ 15:02:
Ik bedoel, waarom zou je denken dat ie middels je kotlinc toegevoegd wordt?
het wordt niet toegevoegd, mijn vraag is: hoe voeg je het toe?

Overigens denk ik er nu aan dat er ook nog maven en gradle bestaan, zou dat anders nodig zijn om het toe te voegen? Kan dat niet met kotlinc?

Als het niet wordt toegevoegd moet je naar ik begrijp de libraries op de commandline toevoegen met -cp library.jar als je het bestand wil runnen wat me ook niet lukt.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • +1 Henk 'm!

  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 07-06 14:56
Salvatron schreef op maandag 16 oktober 2023 @ 15:22:
[...]
Overigens denk ik er nu aan dat er ook nog maven en gradle bestaan, zou dat anders nodig zijn om het toe te voegen? Kan dat niet met kotlinc?
Correct, als jij jou code compileert krijg je alleen je eigen code in de jar. Dat is eigenlijk de standaard binnen de Java wereld. Enige andere dependencies lever je dan mee in een lib folder of via transient dependencies in de maven descriptor van je package als je een library published.

Als je het echt als 1 jar allemaal wilt samenvoegen is een package manager in de vorm van maven of gradle het makkelijkst. Als je dat wilt dan moet je even zoeken op 'fat jar' of 'shaded jar'. Er zijn plugins voor in beide varianten die dit kunnen regelen voor je. Deze jsoup is namelijk nog relatief simpel maar 1 dependency kan zo 10 andere dependencies nodig hebben en die declareren, dan is het gelijk veel handwerk.
Als het niet wordt toegevoegd moet je naar ik begrijp de libraries op de commandline toevoegen met -cp library.jar als je het bestand wil runnen wat me ook niet lukt.
In theorie zou het ook zonder een fat jar die alles bevat prima werken, alleen moet je het bij het opstarten dan dus ook alles wat je gebruikt, maar niet mee gepackaged zit mee geven op het classpath, wat je ook al bij kotlinc hebt gedaan om daar naar de juiste dependencies te wijzen.
Dus iets in de trend van
code:
1
java -cp jsoup-1.16.1.jar -jar program.jar

geeft de java runtime ook de hint dat je jsoup op je classpath wilt hebben, daarmee zal hij waarschijnlijk ook correct opstarten.

Verdiep je vooral even in hoe het classpath werkt, dependency/build managers zoals maven of gradle kunnen veel complexiteit wegnemen maar het is nog steeds wel goed om die basis goed onder te knie te hebben als je veel met de JVM blijft werken.

Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Sleepkever schreef op maandag 16 oktober 2023 @ 15:48:
In theorie zou het ook zonder een fat jar die alles bevat prima werken, alleen moet je het bij het opstarten dan dus ook alles wat je gebruikt, maar niet mee gepackaged zit mee geven op het classpath, wat je ook al bij kotlinc hebt gedaan om daar naar de juiste dependencies te wijzen.
Dus iets in de trend van
code:
1
java -cp jsoup-1.16.1.jar -jar program.jar

geeft de java runtime ook de hint dat je jsoup op je classpath wilt hebben, daarmee zal hij waarschijnlijk ook correct opstarten.
java -cp jsoup-1.16.1.jar -jar t.jar
java -cp ./jsoup-1.16.1.jar -jar t.jar

werken niet (jsoup...jar staat gewoon in dezelde directory), de console zegt:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at MainKt.main(Main.kt:14)
at MainKt.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 2 more
Verdiep je vooral even in hoe het classpath werkt, dependency/build managers zoals maven of gradle kunnen veel complexiteit wegnemen maar het is nog steeds wel goed om die basis goed onder te knie te hebben als je veel met de JVM blijft werken.
oke, ik zal me hier in gaan verdiepen.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 07-06 14:56
Salvatron schreef op maandag 16 oktober 2023 @ 19:46:
[...]


java -cp jsoup-1.16.1.jar -jar t.jar
java -cp ./jsoup-1.16.1.jar -jar t.jar

werken niet (jsoup...jar staat gewoon in dezelde directory)
Ik heb het lokaal even nagespeeld en je hebt helemaal gelijk. Blijkbaar moet ik zelf ook even terug naar de schoolbanken wat betreft classpath gebruik en java. Te verwend de afgelopen jaren door alles voor mij op te laten lossen door gradle, spring en IntelliJ.

De oorzaak lijkt te zijn dat als je -jar gebruikt, de -cp optie genegeerd wordt door java (stackoverflow zegt immers dat dat zo is). Blijkbaar moet de jar dan alles bevatten inclusief alles wat op het classpath zit of referenties op het classpath. Heb ik ook weer wat geleerd vandaag!

Dus in jou geval zou het volgende wel moeten werken met de aanname dat het bestand waar je main methode in staat ook `Main.kt` heet als filename en niet in een package zit:
code:
1
java -cp "soup-1.16.1.jar:t.jar" MainKt

Dus alle libraries die je hebt gescheiden door een dubbele punt op een rijtje in het classpath, en daarna de main class die gestart moet worden compleet met package names en alles.


Maar het moge duidelijk zijn dat dit niet heel fijn werken is. Jsoup is gelukkig een kleine dependency die zelf geen verdere dependencies nodig heeft, maar sommige andere dependencies hebben echt een enorme boom structuur aan andere dependencies die ze zelf weer nodig hebben. Dan wordt dit handwerk al snel onwerkbaar.
Gradle of maven de dependencies laten downloaden, managen en uiteindelijk een fat jar laten bouwen is wel toekomstvaster als je ooit nog andere dependencies nodig hebt, maar geen idee hoeveel ambities je hebt met dit project :)

Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Sleepkever schreef op dinsdag 17 oktober 2023 @ 12:04:
Dus in jou geval zou het volgende wel moeten werken met de aanname dat het bestand waar je main methode in staat ook `Main.kt` heet als filename en niet in een package zit:
code:
1
java -cp "soup-1.16.1.jar:t.jar" MainKt

Dus alle libraries die je hebt gescheiden door een dubbele punt op een rijtje in het classpath, en daarna de main class die gestart moet worden compleet met package names en alles.


Maar het moge duidelijk zijn dat dit niet heel fijn werken is. Jsoup is gelukkig een kleine dependency die zelf geen verdere dependencies nodig heeft, maar sommige andere dependencies hebben echt een enorme boom structuur aan andere dependencies die ze zelf weer nodig hebben. Dan wordt dit handwerk al snel onwerkbaar.
Gradle of maven de dependencies laten downloaden, managen en uiteindelijk een fat jar laten bouwen is wel toekomstvaster als je ooit nog andere dependencies nodig hebt, maar geen idee hoeveel ambities je hebt met dit project :)
dit werkt inderdaad:
code:
1
java -cp "jsoup-1.16.1.jar:t.jar" MainKt


Maar voor toekomstige projecten is het inderdaad beter om gradle of maven alles te laten doen.

Lucht en leegte, zegt Prediker, alles is leegte.

Pagina: 1