質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

731閲覧

Kotlinで書いたライブラリを他のKotlinプロジェクトから呼ぶと'NoClassDefFoundError'エラーになる

退会済みユーザー

退会済みユーザー

総合スコア0

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2017/09/05 09:17

編集2017/09/05 09:37

#環境
IDE: IntelliJ IDEA 2017.2.2
言語: Kotlin 1.1.4
OS: macOS Sierra

#概要
Kotlinで書いたプロジェクトKotlinTestと、同じくKotlinで書いたプロジェクトKotlinTest2があり、KotlinTest2KotlinTest内のクラスを利用します。KotlinTest2をコンパイルしたバイナリKotlinTest2-1.0.jarを実行すると、NoClassDefFoundErrorのエラーが発生します。詳細を下記に書きます。この問題を解決するにはどうすれば良いでしょうか?

イメージ説明

#詳細な状況
2つのプロジェクトは、IntelliJ IDEAのGradleプロジェクトで作成し、build.gradleに数行追加して、さらにHello.ktファイルを追加した状態になっています。ビルドにあたって、Run>Edit Configurationsを開いてGradleの設定を新しく追加し、その中でGradle projectにそのプロジェクト自身を指定し、Tasksにbuildを指定し、適用しています。

KotlinTestプロジェクトは主に以下のファイルから成ります:

gradle

1// build.gradle 2group 'jp.hoge' 3version '1.0' 4 5buildscript { 6 ext.kotlin_version = '1.1.4' 7 8 repositories { 9 mavenCentral() 10 } 11 dependencies { 12 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 } 14} 15 16apply plugin: 'java' 17apply plugin: 'kotlin' 18 19sourceCompatibility = 1.8 20 21repositories { 22 mavenCentral() 23} 24 25dependencies { 26 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 27 testCompile group: 'junit', name: 'junit', version: '4.12' 28} 29 30compileKotlin { 31 kotlinOptions.jvmTarget = "1.8" 32} 33compileTestKotlin { 34 kotlinOptions.jvmTarget = "1.8" 35}

kotlin

1// Hello.kt 2package jp.hoge 3 4class Hello 5{ 6 fun Run() 7 { 8 println("Hello, Kotlin!") 9 } 10}

KotlinTest2のプロジェクトは主に以下のファイルから成ります(KotlinTestのコンパイル結果KotlinTest-1.0.jarlib/以下に置いてあります):

gradle

1// build.gradle 2group 'jp.hoge2' 3version '1.0' 4 5buildscript { 6 ext.kotlin_version = '1.1.4' 7 8 repositories { 9 mavenCentral() 10 } 11 dependencies { 12 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 } 14} 15 16apply plugin: 'java' 17apply plugin: 'kotlin' 18 19sourceCompatibility = 1.8 20 21repositories { 22 mavenCentral() 23} 24 25dependencies { 26 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 27 testCompile group: 'junit', name: 'junit', version: '4.12' 28 compile files('libs/KotlinTest-1.0.jar') // 追加 29} 30 31compileKotlin { 32 kotlinOptions.jvmTarget = "1.8" 33} 34compileTestKotlin { 35 kotlinOptions.jvmTarget = "1.8" 36} 37 38// 以下を追加 39jar{ 40 manifest{ 41 attributes( 42 'Class-Path': configurations.compile.collect { it.getName() }.join(' '), 43 'Main-Class': 'jp.hoge2.HelloKt' 44 ) 45 } 46}

kotlin

1// Hello.kt 2package jp.hoge2 3 4fun main(args: Array<String>) { 5 val hello = jp.hoge.Hello() 6 hello.Run() 7}

実行すると以下のようなエラーが出力されます:

$ java -jar KotlinTest2-1.0.jar Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at jp.hoge2.HelloKt.main(Hello.kt) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自己解決いたしました。

Kotlinのランタイムの中身を、KotlinTest2の生成物(つまり実行されるjar)にリソースとしてコピーする必要があるみたいです。build.gradleに以下を追加しました。

gradle

1task copyKotlin(type: Sync){ 2 configurations.compile.resolve().each { 3 if(it.absolutePath.contains("kotlin-stdlib-1.1.4")){ 4 print it.absolutePath 5 from zipTree(it) 6 into "src/main/resources" 7 } 8 } 9} 10 11build.dependsOn copyKotlin

ランタイムのjarをコピーするのではなく、ランタイムのjarの中身をコピーする必要があることに注意する必要があります。

一部のライブラリはjarに含まれることで逆にエラーが発生する原因となる場合があるので、containsなどの関数を用いて本当にjarに含めたいものだけをコピーしています。今回のケースでは、android.jarやUnityのclasses.jarを生成物に含めてしまったために、Unity上でCommandInvokationFailureの例外が発生してしまいました。

投稿2017/09/06 07:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問