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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

1596閲覧

VSCodeでのJava実行時に参照するjarファイルのクラスを生成するとjava.lang.NoClassDefFoundErrorとなる

退会済みユーザー

退会済みユーザー

総合スコア0

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2022/10/12 14:08

前提

JavaでJacksonを利用してjsonをパースさせる動作確認をしようとしています。
Javaの開発環境としては、VSCodeにJava Extension Packをインストールし、
Jacksonのjarファイル(annotations, core, databind)をダウンロードして参照に追加※しました。

settings.jsonでjava.project.referencedLibrariesの示すフォルダにjarフォルダを配置、
これによりJavaソースコード上の該当jarを使用している箇所でビルドエラーが解消するため
ビルド時の参照については正しく行われているものと考えています。

しかし、デバッグ実行するとjarに定義されたクラスの生成において
NoClassDefFoundError例外となってしまいます。

VSCodeでJavaを実行する際にjarファイルへのクラスパスが通っていないのでは…と考え、
その解決策を探しているものの現状、見つけられていない状態にあります。

VSCodeで外部参照のjarファイルのクラス生成が
実行時にNoClassDefFoundErrorとなるエラーについて、
解決策をご存知であればご教示いただきたく存じます。

追伸
Java、Jacksonのバージョンについては「該当のソースコード」をご参照ください。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper at App.main(App.java:5) Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper 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:520) ... 1 more

該当のソースコード

■フォルダ構成 [VSCodeで開いているフォルダ] ├lib │├jackson-annotations-2.13.3.jar │├jackson-core-2.13.3.jar │└jackson-databind-2.13.3.jar └App.java ■App.java import com.fasterxml.jackson.databind.ObjectMapper; public class App { public static void main(String[] args) { var mapper = new ObjectMapper(); // ここ(5行目)でjava.lang.NoClassDefFoundError例外が発生 } } ■settings.json { "java.jdt.ls.java.home": "C:\\Program Files\\Java\\jdk-17.0.4.1", "java.project.referencedLibraries": [ "lib/**/*.jar" ] }

試したこと


手動で配置したjarを参照するのではなくmavenプロジェクトとして作成し
pom.xmlにdependencyとしてjacksonの3ファイルを指定する。

システム環境変数のJAVA_HOMEとCLASSPATHに
それぞれsettings.jsonで記載した内容を設定する。

classファイルが生成されるbinフォルダに
直接jarファイルを配置してみる。

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

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

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

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

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

m.ts10806

2022/10/13 02:05

結局Mavenプロジェクトとしたいのでしょうか。
退会済みユーザー

退会済みユーザー

2022/10/13 05:25

いえ、mavenプロジェクトとしたいわけではありませんが、 JavaとJacksonで作るロジックの検証が必要なだけなので mavenの使用有無にこだわりはありません。
Crimson_Tide

2022/10/13 07:23

ビルド・デバッグはそれぞれどのように実施していますか またビルドエラーの有無はどのように判断されましたか
退会済みユーザー

退会済みユーザー

2022/10/13 12:00

VSCodeでmainメソッドの上に表示されるRun|Debugから実行し、 Configure Classpathから参照できるbinフォルダに classファイルが存在し例外が発生するまでは実行できることから ビルドエラーではなく実行時エラーであると判断しています。
Crimson_Tide

2022/10/13 13:46

Configure ClasspathのReferenced Librariesの項目にlibフォルダ内の3ファイルはありますか Sourcesのパスは「.」のみになっていますか 念のため一度VSCodeを再起動してみてください
退会済みユーザー

退会済みユーザー

2022/10/13 14:21

はい。SourcesのPathは「.」のみで、 Referenced LibrariesのPatnには以下3つがあります。 ・lib\jackson-annotations-2.13.3.jar ・lib\jackson-core-2.13.3.jar ・lib\jackson-databind-2.13.3.jar VSCode再起動は行いましたが変わりはありません。
m.ts10806

2022/10/13 20:47

プロジェクトエクスプローラの画面キャプチャなどもいただけますか? やはり文字だけだと伝わりにくい部分があると思いますので。
退会済みユーザー

退会済みユーザー

2022/10/14 03:44

念のため確認ですが、プロジェクトフォルダーのパスのどこかに日本語が含まれてませんか? 例えば C:\Users\日本語名\project のような。 私の環境ではパスに日本語が含まない状態だと、記載のsetting.jsonでも動作しました。
退会済みユーザー

退会済みユーザー

2022/10/14 12:19

ありがとうございます。 実は昨日最後にC直下に移動すると動作することが確認できまして、 今日検証してみましたが、ご指摘通り日本語フォルダの問題だったようです。 元々「ドキュメント」フォルダで動作させていました。 jarファイル名を日本語にしても同様のエラーになるので 外部参照のjarへのパスがマルチバイト文字を含むと 実行時にクラスパスとして解決できなくなるようです。 もしかしたら何かライブラリのパスを日本語含むパスでも 動作させる方法もあるのかも知れませんが、 JavaでJsonを処理するロジックの検証が目的なので 今回はこれで解決したものとしたいと思います。 ご協力いただきまして誠にありがとうございました。
m.ts10806

2022/10/14 21:20

顛末を自身で回答として投稿して解決済みにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問