2017-10-20 64 views
1

Je veux inclure jar de Java à Kotlin. J'ai essayé comme ci-dessous, mais j'ai eu une erreur.Comment compiler Kotlin pour inclure Java de Java avec une ligne de commande?

javac -encoding utf-8 javasorce/test/JavaTestClass.java 
jar cvf javasorce/test/JavaTestClass.jar javasorce/test/JavaTestClass.class 

kotlinc kotlin/CallJavaTestClass.kt -cp javasorce/test/JavaTestClass.jar -include-runtime -d kotlin/CallJavaTestClass.jar 

java -jar kotlin/CallJavaTestClass.jar 

L'erreur est:

Exception in thread "main" java.lang.NoClassDefFoundError: 
javasorce/test/JavaTestClass at CallJavaTestClassKt.main(CallJavaTestClass.kt:5) 
     Caused by: java.lang.ClassNotFoundException: javasorce.test.JavaTestClass 
       at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
       ... 1 more 

J'utilise comme ci-dessous les répertoires:

root 
|-javasorce 
| |-test 
| |-JavaTestClass.java 
|-kotlin 
    |-CallJavaTestClass.kt 

S'il vous plaît me dire s'il y a une solution.

Répondre

1

En plus de compiler le code source avec la bibliothèque Java sur le chemin de classe, vous devez exécuter le programme avec la même bibliothèque sur le chemin de classe: si une classe est présente à la compilation, vous en avez besoin sur le chemin de classe temps aussi pour pouvoir l'utiliser.

La manière correcte d'exécuter une application qui a ses classes dispersées à travers plusieurs pots est de transmettre ces fichiers JAR que le chemin de classe à java et pour spécifier en outre la classe qui a la fonction main:

java CallJavaTestClassKt -cp kotlin/CallJavaTestClass.jar:javasorce/test/JavaTestClass.jar 

Le commande ci-dessus suppose que vous avez placé la fonction main au niveau supérieur de CallJavaTestClass.kt (dans ce cas, le nom de la classe est formé par le nom de fichier avec .kt remplacé par Kt), et il n'a pas de déclaration package .... Si vous avez un package, ajoutez-le au nom de la classe en tant que com.example.FileNameKt. Si vous déclarez main dans un objet ou un objet compagnon, utilisez le nom de la classe ou le nom de l'objet (sans Kt) au lieu de CallJavaTestClassKt.

Voir aussi: How to run Kotlin class from the command line?

+0

Merci à vous, je résolu! Votre réponse est très très facile à comprendre! La plupart de vos réponses étaient correctes, mais il y a une erreur. La méthode correcte d'exécution d'une application n'est pas Java CallJavaTestClassKt -cp kotlin/CallJavaTestClass.jar: javasorce/test/JavaTestClass.jar mais java -cp kotlin/CallJavaTestClass.jar: javasorce/test/JavaTestClass.jar CallJavaTestClassKt'. Dans votre suggestion, 'java' n'a pas pu trouver CallJavaTestClassKt. – naokichi