在命令行中运行Java包

42

我已经阅读了之前发布的问题。有些模糊不清,没有一个可以解决我的问题,所以我不得不再次提问。

我有两个简单的类,

package One;
import One.Inner.MyFrame;
public class test
{
    public static void main(String args[])
    {
        MyFrame f= new MyFrame();
    }
}

还有一种类别是,

package One.Inner;
import java.awt.*;
import javax.swing.*;

public class MyFrame extends JFrame
{
    public MyFrame()
    {
        setPreferredSize(new Dimension(400,560));
        setVisible(true);
    }
}

我在Windows命令提示符中的基础文件夹 "basic"。我使用以下命令进行编译:

basic> javac *.java -d .

创建了一个文件夹和子文件夹。

cd One
basic\One> java test

这会生成一大堆错误。许多答案指定了完整路径,但并没有起作用。我的类在One中,因此使用-cp指定One也行不通。


只是为了补充一些关于这个问题的好东西:https://www.webucator.com/how-to/how-compile-packages-java.cfm - Victor
5个回答

64

你需要这样运行它:

java One.Test

要从根目录 (basic) 而不是从 One 目录中执行。您应该始终指定完全限定的类名。

哦,还有在 Java 中包名应该小写,所以它应该是 oneone.inner,而不是 OneOne.Inner。只是一种约定,但几乎所有人都遵循这个约定。


2
之前我弄错了,必须从正确的目录开始操作非常重要。谢谢提醒。我注意到了。我曾错误地认为只有Java内置的包才需要小写。 - user2756339
有没有一种方法可以从同一个目录中运行它?例如,通过命令行选项指定工作目录?我为此搜索了很多,每个人都说“只需向上走一个目录”,但在某些情况下真的很烦人。 - Haralan Dobrev
2
哦,这里是:java -cp ../ one.Test。我确定我以前试过了。 - Haralan Dobrev
1
是的 - 在Java应用程序启动器javaman文件中,它声明:“默认情况下,没有选项的第一个参数是要调用的类的名称。应使用完全限定的类名。”我认为他们应该将其更改为“必须使用完全限定的类名”! - jdurston

24
如果目录是:
basic\One

在软件包的基本目录下运行Java:

basic>java One.test or basic>One.test <optional arguments>
理想情况下,包名应该是小写的,而类名应该是大写字母开头的。

(ideally the package would be lowercase and the class upper case):

basic>java one.Test

如果你收到“不存在”消息,那么java命令无法找到你的类引用的类。你可以使用-cp选项指向它们(“.”表示“这里”,在Windows上你可以用“;”分隔多个位置,在Linux上你可以用“:”分隔多个位置)。

basic>java -cp . one.Test
or
basic>java -cp .;..\..\someJar.jar;c:\someDirectory\classesDirectory  one.Test

5
以下是Haralan Dobrev代码的一行解决问题。
java -cp ../ one.Test

2
这是因为如果您在Java文件中声明了,那么JAVA编译器将认为您在系统中具有相同的文件夹架构。在您的情况下,Java编译器正在寻找One作为包,然后是test.class。或者更具体地说,只需查看您的.class文件,您就可以看到它正在寻找什么路径。请参阅下面的图像(我使用了Hello和Tester)。

.class

正如您在图像中看到的路径是Hello/Tester(我的案例),因此架构应该类似于Hello->Tester。
如果您没有相同的架构并希望在编译时创建相同的架构,则使用javacp命令即可。

2

创建一个带有包的类时,如果您想要在cmd中运行它,您必须创建一个与包名称相同的目录,将.class文件放入其中,然后就可以轻松运行它。例如,您创建了一个名为“one”的类,并且该类位于名为“pack”的包中,则必须运行以下命令:

1 javac one.java
编译后创建一个名为pack的目录,然后运行以下命令
2 java pack.one
注意:
所有这些都必须在当前工作目录中完成,“one”是此处选择的文件名和主类名 我们都知道第一个命令中使用的是文件名,第二个命令中使用的是主类名


你应该使用格式化来方便理解你的答案。 - Nicolas Henneaux

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