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。对于给定的一组导入语句,有没有一种方法可以找出在编译过程中我需要添加到类路径中的完整 jar 列表是什么?这很重要的一个原因是我使用的是 Mahout 的 Cloudera 发行版,而不是 Apache 版本,因此作者似乎没有兴趣提供帮助。在其他语言中,比如python,就容易多了,很多Java程序员会处理命令行编译问题吗,比如这些?如果是这样,怎么办?

4

1 回答 1

0

虽然没有像maven这样的依赖解析工具,没有捷径可以找到依赖,但是一些shell命令绝对可以减轻一些压力。

查找包含特定类的 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 回答