まず、自分が作ったjarと、外部提供jarを使用する場合について書きます。
おそらく、現在は次のようなコマンドで実行していると思います。
しかし、-jar
オプションをつけた場合、(環境変数や-cp
,-classpath
オプションで設定した)クラスパス設定は無視されます。
オフィシャルのドキュメントでは、次の箇所が該当しますね。(該当Java8ドキュメントは日本語化されていないようですが)
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html:
When you use the -jar option, the specified JAR file is the source of all user classes, and other class path settings are ignored.
https://docs.oracle.com/javase/jp/6/technotes/tools/windows/java.html
このオプションを使用すると、指定した JAR ファイルがすべてのユーザークラスのソースになり、ユーザークラスパスのほかの設定は無視されます。
というわけで、-jar
オプションを使わずに実行するようにすればクラスパス設定は効きます。
> java -cp Sample.jar;commons-lang3-3.4.jar Sample
クラスパスに自分で作ったjarと外部製のjarを両方指定し、かつ、(マニフェストファイルのメインクラス記述を利用できないので)明示的に実行するクラスを指定してあげる方法です。
次に、上記の方法ではちょっとコマンドが煩雑なので、マニフェストファイルを利用して簡略化します。
マニフェストファイル(s.mf
)の内容を以下のようにしてください。
Main-Class: Sample
Class-Path: commons-lang3-3.4.jar
そして、いつもどおりjar
を作成します。
> jar cvfm Sample.jar s.mf *.class
これで、カレントディレクトリにSample.jar
とcommons-lang3-3.4.jar
を置いておけば、従来通り次のコマンドで実行できるようになります。
勘違いされていると思うのでここで繰り返しておきますが、-jar
オプションを指定した場合、環境変数CLASSPATH
に設定した内容は無視されます。
今org.apache.commons.lang3.math.NumberUtils
が参照できているのは、マニフェストファイルにクラスパス設定を行っているからです。
上記の方法だと、jarファイルが2つになって、やはりちょっと煩雑です。これをひとつにまとめたい…となると、一旦commons-lang3-3.4.jar
を解凍し、自分の作成したクラスと統合した上でjarを作る必要が出てきます。
その作業を自動化してくれるツールがmaven assembly pluginなどです。
(1ファイル化されたjarのことを、Fat-Jarと呼んだりUber-Jarと呼んだりするようですので、興味があればこれらの単語で検索してみてください)。
(補足)
私は、jarで提供されているものはjarのまま使用したほうが良いと思います。
例えば、今回のNumberUtilsのソースはこちらになりますが、
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
とある通り、このクラスは単独では動かず、別のクラスファイルも必要になります(そしてこれらのクラスもまた別のクラスを要求しているかもしれないわけです)。
これらをいちいち考えながら使用するのは面倒すぎます。