在Windows命令行中将Jar文件添加到构建路径

4
我很生气不得不问这个问题,但我无法使它工作。目前我有一个项目,其中包括:
5个位于src/文件夹中的类 2个名为profiles.jar和classifier.jar的JAR文件位于根目录中
我想创建一个"makefile?"或"批处理文件?"来编译和运行这些类,并将jar添加到buildpath,但首先要从Windows命令行中运行?我不确定该如何做。
当我尝试执行时,它会显示找不到类的错误,最可能是由于我没有正确将jar添加到buildpath中。在命令提示符中运行此功能需要使用哪些命令?
谢谢 Philip 编辑
感谢您的帮助,但我遇到了很多麻烦。 目前,我的项目包括src文件夹中的5个类和jar文件夹中的2个jar文件。
以下是命令: 我正在运行:
set CLASSPATH=C:\wamp\www\news\UserProfiling\jars\classifier.jar;C:\wamp\www\news\UserProfiling\jars\profiles.jar 然后从根目录运行:
javac src/*.java
然后:
java -cp ./src:./jars/* src/Interaction
Interaction是主类,我收到各种noclassfound错误,我做错了什么吗? 非常感谢Philip 错误信息:
java -cp ./src:./jars/* Interaction Exception in thread "main" java.lang.NoClassDefFoundError: Interaction Caused by: java.lang.ClassNotFoundException: Interaction at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Could not find the main class: Interaction. Program will exit.

交互在哪个包中?(我期望看到类似于com.bla.Interaction的东西) - Joel
你遇到的错误是因为没有使用完整的主类名,必须包括包名。所以,你需要像'com.x.y.Interation'这样的东西,而不是'Interation'。 - Joel
最初,由于是一个非常小的程序,默认情况下它位于默认包中,但后来我尝试将其放入一个名为test的包中并运行:java -cp ./src:./jars/* UserProfiling.Test.Interaction(UserProfiling是我的项目名称,这样做对吗?)但我仍然收到了相同的错误提示。 - Phil
我注意到你一直提到 "src",显然那是你的Java源代码所在的地方。但是CP需要指向编译后的 ".class" 文件所在的位置!它们也在 "src" 中吗?还有,在你之前的评论中,“test”使用了不同的大写形式。 - Carl Smotricz
4个回答

5
在Java 5版本或更早的版本中,您必须逐个指定每个jar文件以及源代码的根目录,并将它们添加到类路径中。例如:
java -cp a.jar:b.jar:c.jar:./src MainClass

在版本6中,您可以使用通配符来匹配jar包,例如:

java -cp ./src:* MainClass

但是将您的JAR文件放入子目录中可能会更加清晰,例如:

java -cp ./src:./jars/* MainClass

基本上,您的makefile或启动脚本需要构建类似上述命令的命令。
更多信息 - Sun docs (v6) 更新 - 根据您的第二次编辑,您需要指定完整的主类名称,因此如果该类在名为'com.mypackage.MainClass'的包中,则需要执行以下操作:
java -cp ./src:./jars/* com.mypackage.MainClass

我建议您先让该命令作为独立的命令运行,然后再让整个脚本运行。通过删除移动部件,可以更快地调试并更容易地查看正在发生的情况。

非常感谢您的帮助,但我遇到了很多麻烦。 目前我有一个包含五个类的项目在 src 文件夹中,而在 jar 文件夹中有两个 JAR。以下是我正在运行的命令:set CLASSPATH=C:\wamp\www\news\UserProfiling\jars\classifier.jar ;C:\wamp\www\news\UserProfiling\jars然后从根文件夹运行: javac src/*.java然后:java -cp ./src:./jars/* src/InteractionInteraction 是主类,我得到了各种找不到类的错误,我做错了什么吗? 非常感谢 Philip - Phil

1
我建议您看一下antmaven。Ant是一个解决方案,可以非常直接地做您想要做的事情,而Maven在处理依赖关系时具有其优势,但不太直接。

我猜Phil想做的可能只是一项单次任务,使用Ant或Maven可能有些过度。但是,从长远来看值得考虑... - Joel
Ant相对来说很容易设置和使用,而且有一个项目文件可以方便地重复这个过程和/或进行更改/扩展。另一方面,Maven...嗯,我更喜欢避免使用它。 - Carl Smotricz

1
关于你的第二个问题:如果你使用
java -cp ./src:./jars/* src/Interaction

它将尝试启动不存在的src/Interaction类。src已经在您的类路径中,所以您只需要执行以下操作:

java -cp ./src:./jars/* Interaction

谢谢,但我仍然遇到相同的错误。我已经将其添加到问题描述中。 - Phil

0

我想我找到了你的问题。

javac src/*.java

java -cp ./src:./jars/* src/Interaction

这个问题困扰着许多初学者:您需要从源代码树开始的目录中运行 javac 和 java。在您的情况下,该目录是 src。由于 src 不出现在您的包名称中,因此它也不应出现在您的编译/执行路径中。

所以你应该:

cd UserProfiling/src 

并运行

javac *.java 

并且

java -cp .:../jars Interaction 

从那里开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接