お世話になります。Javaでプログラミングの勉強をしています。
mavenなど、Jarの依存関係を解決してくれるツールがありますが、
バージョンが違うlog4jなどが複数の依存ライブラリで利用されていて、
実行時にエラーが出てしまうことがあります。(コンパイル時にはエラーは出ない)
例)
dev_project ->log4j v1.2.4に依存
+-depend_project_a -> log4j v1.1.3に依存
+-depend_project_b -> log4j v1.1.4に依存
+-depend_project_c -> log4j v0.9.1に依存
こういった場合、mavenを利用していれば、依存関係階層を調べて
適宜excludeしていけばよいと思います。
しかしそのようなツールを使っていない(純粋なjavaプロジェクト)場合、
どのようにバージョン違いの重複するjarを調べたら良いかわかりません。
私が試してみたのは、jarのクラスパスをひとつずつチェックして
log4j-****.jarの定義をひとつずつ探すという方法です。
これは大変手間がかかります。
テストケースなどJavaコード内で調べる方法はありますでしょうか。
どうぞ宜しくお願い致します。
■参考環境
OS:windows8.1
Java:oracle-java1.8
eclipse: 4.4
maven: 3.2
No.1ベストアンサー
- 回答日時:
この回答への補足
解決しました。
クラスパスを取得し、jar内のクラスを取得していけば
実際にクラスがロードされているかどうかに関わらず、
重複するパッケージ・クラスを調査することができました。
サンプルプロジェクト構成ここから
testprj
│ .classpath
│ .project
│
├─.settings
│ org.eclipse.jdt.core.prefs
├─lib
│ log4j-1.2.14.jar
│ log4j-1.2.15.jar
│ log4j-1.2.16.jar
│ log4j-1.2.17.jar
│
└─src
└─jp
└─co
└─testprj
DependJarDetectTest.java
サンプルプロジェクト構成ここまで
サンプルコード(DependJarDetectTest.java)ここから
package jp.co.testprj;
import java.io.File;
import java.util.Enumeration;
import java.util.Properties;
import java.util.TreeSet;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class DependJarDetectTest {
private TreeSet<String> resultSet = new TreeSet<String>();
public static void main(String[] args) {
try {
new DependJarDetectTest().execDetect();
} catch (Exception e) {
e.printStackTrace();
}
}
private void execDetect() throws Exception {
Properties prop = System.getProperties();
String javaclasspath = prop.getProperty("java.class.path", null);
String[] classPathArray = javaclasspath.split(";");
for (int i = 0; i < classPathArray.length; i++) {
System.out.println("java.class.path [" + i + "] = " + classPathArray[i]);
getJarFileClassListFromClassPath(classPathArray[i]);
}
}
private void getJarFileClassListFromClassPath(String classPath) throws Exception {
File file = new File(classPath);
if (file.isDirectory()) return;
JarFile jarFile = new JarFile(file);
for (Enumeration<?> e = jarFile.entries(); e.hasMoreElements();) {
JarEntry entry = (JarEntry) e.nextElement();
if(entry.isDirectory() || entry.getName().indexOf(".class") < 0) continue;
if(resultSet.contains(entry.getName())) {
System.out.println("\t[競合]: " + entry.getName());
} else {
System.out.println("\t" + entry.getName());
resultSet.add(entry.getName());
}
}
jarFile.close();
}
}
サンプルコードここまで
ご協力頂きましてありがとうございました。
回答頂きましてありがとうございます。
私の質問の仕方が悪かったのですが、
どのjarのどのクラスが重複しているかわからない状態から調べる方法を知りたかったのです。
質問内の例ではlog4jが競合していることがわかってる風にとれるので、
その場合はteketonさんの方法で代表的なクラスからどのjarが読み込まれているか調べることが可能ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PDF PDF印刷後に「変更を保存しますか?」と訊かれる 2 2023/04/28 17:35
- その他(ソフトウェア) JavaとOracle Javaって何が違うんですか? 1 2022/05/05 05:46
- Excel(エクセル) 【VBA】PDF出力に任意のファイル名前を付ける方法 3 2023/07/21 10:55
- カップル・彼氏・彼女 共存の抜け出し方について。高3カップルです。 今彼女と8ヶ月付き合っています! 受験生で彼女と勉強の 1 2023/05/06 08:20
- Java マイクラjavaでForgeを入れたいのですが、インストールした.jarファイルが展開されてしまい中 1 2023/07/28 22:30
- その他(悩み相談・人生相談) 恋愛依存と育ってきた家庭環境 他者が離れていくことが怖く過度に顔色を伺ってしまうことと家庭環境は関係 3 2022/08/29 17:50
- 依存症 回避依存+恋愛依存×恋愛依存の関係 2 2022/10/22 18:57
- 依存症 スマホ依存をやめたいです… 2 2022/12/18 01:16
- その他(ニュース・社会制度・災害) 元薬物中毒者や元薬物依存症者について 1 2022/05/03 07:23
- その他(悩み相談・人生相談) アルコール依存性の人って怒りっぽいでしょうか? 私の元彼は離婚してからアルコール依存性になり3ヶ月入 3 2023/02/13 23:05
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
重複エラーを解決するには
Java
-
同じパッケージ、クラス名が含まれているjarが複数ある場合
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Eclipseで、プロジェクト名のと...
-
Eclipseの環境について
-
tomcat起動時エラー
-
eclipseでのsvn認証エラー回避方法
-
エラー:org.springframeworkが...
-
javaでEnumerationを使いたいの...
-
致命的: StandardServer.await:...
-
MySQLでアンダーバーを検索
-
getParameterについて
-
ListFilesに失敗する
-
JSP内でString型からint型に変...
-
java eclipse apache tomcat 9....
-
eclipseをバージョンアップした...
-
Eclipseで次のエラー箇所にジャ...
-
JBossについて
-
JFreeChartを使うとコンパイル...
-
JSPで意味不明のコンパイルエラー
-
タグが閉じてないというエラー...
-
-Xlint:uncheckedオプションと...
-
Tomcat起動時のエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipseで、プロジェクト名のと...
-
エラー:org.springframeworkが...
-
シンボルが見つかりませんとい...
-
eclipseでのsvn認証エラー回避方法
-
eclipseをバージョンアップした...
-
Javaのエラーについてです
-
タグが閉じてないというエラー...
-
Eclipseで次のエラー箇所にジャ...
-
構文エラーのやり直しについて
-
tomcat起動時エラー
-
コンパイル時にエラーが出てし...
-
JSP内でString型からint型に変...
-
eclipseのエラーについて質問で...
-
Eclipseの環境について
-
DataSetのFilter
-
JSPで意味不明のコンパイルエラー
-
JBossについて
-
Eclipse デバッグ エラー処理
-
Java エスケープ文字
-
jspのファイルでエラーが出る
おすすめ情報