0

Maven や Eclipse などのツールが、Java アプリケーションのビルドとコンパイル、特に依存関係の処理に役立つと考える人が多いことは理解しています。しかし、特に多くの依存関係がある場合に、コマンドラインから Java アプリをコンパイルして実行することに関連する質問があります。私が取り組んでいることに役立たないので、「それをしないでください」のような答えをいただければ幸いです。たとえば、Mahout in Action の Mahout での最初のレコメンデーションの例に取り組んでいる場合、コマンド ラインから例をコンパイルして実行する方法は明らかではないようです。

javac -cp /usr/lib/mahout/mahout-core-0.7-cdh4.2.0.jar RecommenderIntro.java

これはエラーなしで完了します。ただし、次の問題は実際に出力を実行することであり、より多くの依存関係が必要と思われます。ご想像のとおり、これはイライラします。

$ java -cp /usr/lib/mahout/mahout-core-0.7-cdh4.2.0.jar:. RecommenderIntro
    Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<clinit>(FileDataModel.java:121)
    at RecommenderIntro.main(RecommenderIntro.java:19)
    Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 2 more

ただし、必要な jar ファイルのほとんどまたはすべてが /usr/lib/mahout/lib にあることは明らかです。特定の import ステートメントのセットについて、コンパイル中にクラスパスに追加する必要がある jar の完全なリストを確認する方法はありますか? これが重要な理由の 1 つは、私が使用している Mahout の Cloudera ディストリビューションは Apache バージョンではなく、そのため、作成者は支援に関心がないようです。Python などの他の言語では、はるかに簡単です。多くの Java プログラマーは、これらのようなコマンド ラインのコンパイルの問題を処理しますか? もしそうなら、どのように?

4

1 に答える 1

0

Maven のような依存関係を解決するためのツールを使用せずに依存関係を見つける簡単な方法はありませんが、一部のシェル コマンドを使用すると、確実にストレスを軽減できます。

特定のクラスを含む jar の検索:

CLASSNAME=org/slf4j/LoggerFactory
for i in $(find /path/to/jar/folder -type f -name "*.jar"); 
do 
  jar tf $i | grep $CLASSNAME && echo from $i; 
done

指定されたディレクトリ内のすべての jar のクラスパスを構築します。

CLASSPATH=$(find /path/to/jar/folder -type f -name "*.jar" -exec echo -n {}: \;)
java -cp $CLASSPATH RecommenderIntro
于 2013-03-22T22:41:22.893 に答える