从批处理文件运行Java程序出现问题,在IDE中可以正常运行

3

我正在为我的新笔记本电脑上的一门课程做一些基础Java作业,问题是,我似乎无法按照教练给我的方向从批处理文件中编译和运行程序。

我已经在环境变量设置中将路径变量设置为我的JDK。

我的程序是一个简单的发货程序,用于跟踪发货信息 - 我已经在NetBeans中完美地运行了这个程序(我们的教练建议我们使用NetBeans来开发代码),但是他将使用批处理文件进行测试,因此我们也被建议在提交之前使用我们自己创建的批处理文件在我们的系统上进行测试 - 这很简单明了。

问题是,我似乎无法让它工作。我以前从未这样做过,但我曾经使用.bat文件编译和运行C++程序,以及在unix系统上使用makefiles,所以我觉得自己绝对很傻,没有自己找出解决方法,但是我的所有搜索都没有返回任何有用的解决方案。

我的程序由3个.java文件组成:

Shipment.java - 一个包含在ShipmentHW1类中实现抽象方法的接口

ShipmentHW1.java - 一个类,实现了来自Shipment的抽象方法,并具有构造函数等来创建可用对象

TestShipment.java - 这个程序的主类,它利用并创建基于预设参数的ShipmentHW1对象。这是非常基础的东西,在NetBeans IDE中也可以完美运行。

我们收到的指示说明批处理文件必须在包目录内(在这种情况下,我已经将一个名为“shipping”的单独文件夹设置为包名,放在了我的桌面上 - 不应该有任何问题),其中包括3个.java文件。

他们说,如果你不需要显式列出JDK的路径,那么你只需要

    javac TestShipment.java
java TestShipment.java
pause

随后我遇到了错误,提示“无法找到符号Shipment s = new ShipmentHW1();”。我尝试添加导入语句,但由于它们在同一程序包中,这本不应该是问题。
目录路径为:
C:\Users\X\Desktop\shipping

所有7个文件都包含在:

TestShipment.java
TestShipment.class
Shipment.java
Shipment.class
ShipmentHW1.java
ShipmentHW1.class
doHW1.bat

有人有什么想法吗?如果我表达不清楚,我可以提供更多信息。

另外,我使用的是Windows 8操作系统,如果这有任何区别,请告诉我。


2
了解“classpath”的概念。 - Sotirios Delimanolis
我也尝试过这个:javac -cp "lib*" Testshipment.java java -cp "lib*" TestShipment.java但是我没有看到任何明显的变化。就好像它找不到坐落在同一目录下的其他文件一样。 - user3216836
你能展示一下你的目录结构以及每个目录中的文件吗? - Sotirios Delimanolis
C:\users\x\desktop\shipping<JAVA FILES>。"shipping" 是包名,其中包含所有的 .java/.class 文件以及名为 doHW1.bat 的 .bat 文件。 - user3216836
如果您编辑问题并更加详细,那么这将会更容易。 - Sotirios Delimanolis
好的,我已经添加了那个小细节。 - user3216836
4个回答

1
已解决。
批处理文件现在如下:
javac TestShipment.java Shipment.java ShipmentHW1.java
cd ..
java shipment.TestShipment
pause

它的工作效果非常好。有人知道为什么我需要调用package.class而不是正常编译它吗?


你只是正常编译了它。(编译是“javac”步骤。)简短的答案是类加载。当Java查找一个类时,它从CLASSPATH中的每个位置开始查找,沿着与其包对应的目录树向下查找 - 因此,当一个类引用另一个名为“shipment.Shipment”的类时,类加载器在CLASSPATH中的每个路径下查找shipment/Shipment.class。(还有很多其他事情要做,但这是快速版本)在许多配置(包括您的配置)中,默认情况下,CLASSPATH包含当前目录。 - Sbodd

0

试着去做

javac TestShipment.java
java TestShipment
pause

我已经尝试过了,遇到了同样的问题,但现在又出现了一个额外的奖励:java.lang.NoClassDefFound error: wrong name (shipping\TestShipment)。我已经多次查看了代码,以确保这不仅仅是一个愚蠢的拼写错误或不正确的文件路径,但一切都应该是正确的... - user3216836
在执行 javac TestShipment.java 后,使用 dir 命令并查看 cmd 返回的信息。你之前也执行了 java TestShipment.java,这样做就没有必要使用 javac 了,因为 javac 的作用是将 .java 文件编译成 .class 文件。如果其他方法都不行,尝试使用 java TestShipment.class。 - Octal Software
目录中有7个文件 - TestShipment.java TestShipment.class Shipment.java Shipment.class ShipmentHW1.java ShipmentHW1.class doHW1.bat,我的目录路径是C:\ users \ x \ desktop \ shipping。 - user3216836
我明白了,那么请尝试执行以下命令:javac FILE_YOU_WANT_TO_RUN.java 然后再执行 java FILE_YOU_WANT_TO_RUN.class - Octal Software
在"java TestShipping"后面加上一个".class"。 - Octal Software
显示剩余2条评论

0

在没有查看TestShipment.java的内容之前,我会假设您对ShipmentShipmentHW1类有一些依赖关系。因此,当您执行使用TestShipment类的程序时,您需要拥有每个文件的.class文件(以及任何其他依赖项)。

因此,在运行java命令之前,您需要编译Shipment.javaShipmentHW1.java。如果它们在同一个包中,那么就没问题了,否则,您将不得不为-cp选项指定适当的值。

在运行带有类名的java时,您需要指定完全限定的类名。


它们确实在同一个包中 - 这是奇怪的一部分。.class 文件已经生成在文件夹中,但随后出现了错误。而这些错误告诉我找不到那个类,这是荒谬的。显然我做错了什么,但与代码本身或文件存放位置无关。除非你不能只将它们放在一个文件夹中并运行,但我从未听说过这是个问题。 - user3216836
@user .java文件是否存在并不重要,对应的编译后的.class文件必须存在。你是说它们存在吗? - Sotirios Delimanolis

0
如果您的.java文件被声明为在“shipping”包中,则可能需要从“shipping”的父目录运行java,例如:
cd <path>/shipping
javac TestShipment.java
cd ..
java shipping/TestShipment

所以我应该更改目录到...shipping吗?它已经在shipping目录下了,cd <blah>/shipping 只会将我的工作目录放在它已经存在的位置上。 - user3216836

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