■ トラブル内容
* Commons の RandomStringUtils をラップした自作の共通処理を
まとめたJavaプロジェクト「CustomCommon」をJARファイル化し、
そのJARファイルを、Javaプロジェクト「SampleProject」で使用したところ、
以下の「例外内容」の例外「ClassNotFoundException」が発生した。
なお、プロジェクト「SampleProject」には「commons-lang3-3.5.jar」をインポートしてある
=> 詳細は、以下の「構成」を参照。
* Javaプロジェクト「CustomCommon」内で例外が発生したメソッドを使用しても例外が発生しなかった
例外内容
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.RandomStringUtils
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
構成
+ Javaプロジェクト「CustomCommon」(JAR化する「CustomCommon.jar」) ★自作の共通処理★
+ src
+ PasswordCustomUtil.java
+ lib
+ velocity-1.7-dep.jar
など...
+ Javaプロジェクト「SampleProject」 ★使用者側★
+ src
+ Main.java(PasswordCustomUtil.javaを使用)
+ lib
+ CustomCommon.jar
+ commons-lang3-3.5.jar
PasswordCustomUtil.java
import org.apache.commons.lang.RandomStringUtils;
public class PasswordCustomUtil {
public static String creatNumberInitPassword() {
return RandomStringUtils.random(4, "0123456789");
}
}
■ 原因
自作の共通処理「CustomCommon」で使用していた「RandomStringUtils」は、
velocity-1.7-dep.jar内に入っているcommons-lang2系「org.apache.commons.lang.RandomStringUtils」を使用している
しかし、使用者側のJavaプロジェクト「SampleProject」では、commons-lang3系のJARファイルをインポートしていたため。
commons-lang3系だと「org.apache.commons.lang3.RandomStringUtils」で
「lang3」ってなって、パッケージ名がcommons-lang2系とはそもそも異なる。
補足:velocity-1.7-dep.jarについて
https://blogs.yahoo.co.jp/dk521123/34456704.html
より抜粋
「依存関係のあるツールも含まれたJARファイル」
=> commons-lang2系が含まれている
■ 解決案
* commons-lang2系「commons-lang-2.X.jar」又は「velocity-1.X-dep.jar」を
使用者側のJavaプロジェクトにインポートする