如何使用包名运行java类

我有两个java类如下:

1。

none package class System.out.println("App1 hello world..."); 

2。

 has package package java.java.package1; System.out.println("App1 hello world..."); 

然后,我编译并运行它们,结果如下:

 D:\javaTest>javac App1.java D:\javaTest>javac App2.java D:\javaTest>java App1 App1 hello world... D:\javaTest>java java.java.package1.App2 Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/Ap p2 Caused by: java.lang.ClassNotFoundException: java.java.package1.App2 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) Could not find the main class: java.java.package1.App2. Program will exit. 

那么如何运行App2类呢?

您应该使用-d选项进行编译,以便类最终位于适当的目录层次结构中:

 javac -d . App2.java java java.java.package1.App2 

此外,您不应该首先使用以java开头的包名。

此外,如果将放在适当的目录层次结构中,并从层次结构的根编译/运行,则不会出现此问题。

你必须把-d directory

设置类文件的目标目录。 如果类是包的一部分,则javac将类文件放在反映包名的子目录中,根据需要创建目录。 例如,如果指定-dc:\ myclasses并且该类名为com.mypackage.MyClass,则类文件名为c:\ myclasses \ com \ mypackage \ MyClass.class。

App2需要位于java / java / package1目录中。 在java中,包名称和源代码的目录必须匹配。 你没有得到编译错误?

您创建一个新目录。 这是包含您的工作的目录,并不是您的包的开头。

例如,我创建文件夹/ terri开始。

然后我在它下面创建文件夹结构/ clarie / andrea。 在这个例子中,我的包将被称为claire.andrea。 正常的包名称以com开头,然后是公司名称或类似的东西(或标准java包的java,所以不要使用它:如java.lang。*)。

在andrea文件夹中,我创建了一个名为Saluton.java的java文件,其中包含Saluton类(只打印hello)。 类名和文件名必须匹配。

要编译,从terri /文件夹:javac。\ claire \ andrea \ Saluton.java这将在\ terri \ claire \ andrea \ Saluton.class中创建一个Saluton.class

要运行:(再次来自/ terri),我这样做:java -cp。 claire.andrea.Saluton其中说,使用当前目录中的类路径。
我的主程序在claire.andrea包中,类名是Saluton。

这是run:\ terri java -cp。 claire.andrea.Saluton

“你好,世界”。

总而言之,包名称与底层目录结构非常匹配。 该文件(如果它引用了一个包)必须存在于它所引用的目录结构中。 如果我使用包claire.andrea在/ terri中编译Saluton.java我还没有找到运行它的方法,它确实可以正常编译。

此外,类的文件名必须与该文件中的公共类匹配。

要运行,请包装.Class。 通常,包不是大写的,类是。