Linuxのマシンで、eclipseで実行した場合と、実行可能なJARファイルを実行した場合で、使われるクラスローダーが変わってしまい、プログラムが正常に動作しません。
eclipseから実行した場合は、"sun.misc.Launcher$AppClassLoader"が使われ。
Exportした、Runnable JAR fileを、実行した場合は"java.net.URLClassLoader"が使われます。
JARの実行はシェルにて、下記のようにしています。
export JAVA_HOME=/・・・/jdk1.6.0_30
$JAVA_HOME/jre/bin/java -jar xxxx.jar
※JAVA_HOME、CLASSPATH設定は無い状態で、シェルを実行しています。
※JAVA_HOMEをコメントアウトしても、状況は変わりませんでした。
eclipseでは、上記シェルのJAVA_HOMEで指定したものと、ビルドパスのライブラリに指定されたものが同じパスのものであることを確認しています。
JARで実行した場合も、"sun.misc.Launcher$AppClassLoader"が使われた欲しいのですが、どうすれば良いでしょうか。
クラスローダーについて、あまり知識がなくお助けいただけないでしょうか。よろしくお願いいたします。
補足
Windows環境では、Eclipse環境でもJAR環境でも"sun.misc.Launcher$AppClassLoader"が使われ正常に動作します。
蛇足
問題個所は、Java Persistence APIのeclipselink、org.eclipse.persistence.internal.jpa.deploymentパッケージのPersistenceUnitProcessor.javaで、クラスローダーのgetResourceを使っている個所です。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
Linux環境で試してみましたが、実行可能JARファイルを-jarオプションで起動した場合でもsun.misc.Launcher$AppClassLoaderが使われて現象を再現できませんでした。
しかし、どのClassLoaderが使われるかに依存しないコードに変えるべきだろうと思います。-jarオプションで実行するときに使われるClassLoaderについての規定はおそらく仕様にないでしょうし、Sun (Oracle)以外のJava実装がsun.misc.Launcher$AppClassLoaderという名前のクラスを持っているとは限りませんから。
ちなみに、java.net.URLClassLoaderにもgetResource()メソッドはあります。getResource()を使っている部分が問題だと分かっているなら、URLClassLoaderの場合の動作は期待したものとどのように違うのですか?
salsberryさん
こんにちは、わざわざ再現確認までありがとうございます。
まず、ClassLoaderに依存しないコードに変えるべきということですが、クラスローダーを使っているのは、Eclipse projects(http://www.eclipse.org/eclipselink/)のクラス部分なので、出来れば原因をつきとめてソース修正は回避したいと考えています。
PersistenceUnitProcessorクラスのfindPersistenceArchivesメソッドにて、クラスローダーのgetResourcesが使われていて、実行環境の相対パスから設定ファイルを取得したいみたいなのですが
public static Set<Archive> findPersistenceArchives(ClassLoader loader, String descriptorPath){
Archive archive = null;
Set<Archive> archives = new HashSet<Archive>();
Enumeration<URL> resources = loader.getResources(descriptorPath);
while (resources.hasMoreElements()){
URL descUrl = resources.nextElement();
URL puRootUrl = computePURootURL(descUrl, descriptorPath);
・
・
}
sun.misc.Launcher$AppClassLoaderだと、descriptorPathに対して
descriptorPath -> "META-INF/persistence.xml"
↓
descUrl -> "//opt/Import/build/classes/META-INF/persistence.xml"
puRootUrl -> "file://opt/Import/build/classes/"
ちゃんとローカルの設定ファイルを見つけれるのですが
java.net.URLClassLoaderだと
descriptorPath -> "META-INF/persistence.xml"
↓
descUrl -> "META-INF/persistence.xml"
puRootUrl -> "uri:/"
みたいな感じで、ファイルを見つけることができません。
再現寛容にて、試行錯誤してみましたがやっぱりダメです。来週にもうひとつLinux環境があるのでそちらでも試した見たいと思います。
タイムアップで、意向とは異なりますがソース修正も考えないといけないかもです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP eclipse pleiades phpのインストールについて 1 2023/02/03 17:15
- Java マイクラjavaでForgeを入れたいのですが、インストールした.jarファイルが展開されてしまい中 1 2023/07/28 22:30
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Java EclipseとVisual StudioをPC1台にインストールしただけではPCは重くならない? 3 2022/12/08 15:35
- UNIX・Linux ubuntuのサーバー(virtual box)が、再起動するとデータが消えてしまいます。 4 2022/04/27 21:29
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- Java jdk17.06のインストーラーが起動しない 1 2023/03/27 21:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipse(JAVA)のデバッグで他...
-
Javascriptの値をJava(JSP)へ渡...
-
jasper.exceptionとは?
-
NoClassDefFoundError: javax/m...
-
「ワークスペースをビルド中」...
-
split関数で区切り文字がない場合
-
Javaで年月の取得(YYYYMM形式で)
-
eclipseのjavaを実行できない
-
Google Colabでimport soxが出...
-
eclipseでスタックサイズを変更...
-
JAVAにのeclipseに関する質問で...
-
スレッドの状態遷移について。。。
-
Eclipseで実行できてコマンドプ...
-
コミット前の更新データをチェ...
-
[JAVA]evalで文字列を計算式に!
-
javaアプリケーションをH...
-
eclipseが使えません
-
eclipseで「サーバーで実行」表...
-
優先順位の概念について質問
-
エクリプスで実行時、最新クラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
split関数で区切り文字がない場合
-
JAVAにのeclipseに関する質問で...
-
Eclipse(JAVA)のデバッグで他...
-
「ワークスペースをビルド中」...
-
Javascriptの値をJava(JSP)へ渡...
-
eclipseでスタックサイズを変更...
-
コミット前の更新データをチェ...
-
Javaで年月の取得(YYYYMM形式で)
-
Eclipseで実行>Javaアプリケー...
-
eclipseのjavaを実行できない
-
jasper.exceptionとは?
-
eclipse実行ができない
-
Eclipse 実行→Javaアプリケー...
-
環境変数設定で
-
バイナリーコードと、ソースコ...
-
javaからVBAを実行する方法を教...
-
Javaについての質問です。 コン...
-
Worksheet_Changeが動かない
-
エクリプスで実行時、最新クラ...
-
Javascriptのパーミッション
おすすめ情報