名称中带有点的Java包文件夹
给定一个包含名称中带有点的Java包文件夹,java,classpath,Java,Classpath,给定一个包含 package com.mycorp.foo; public class MyClass { public static void main (String[] args) { System.out.println("Hello, world!"); } } 在以下路径中(注意文件夹名称中的点): 以下工作很好: $ javac com/mycorp.foo/MyClass.java 生成/com/mycorp.foo/MyClass.class,但这不起作用
package com.mycorp.foo;
public class MyClass {
public static void main (String[] args) {
System.out.println("Hello, world!");
}
}
在以下路径中(注意文件夹名称中的点):
以下工作很好:
$ javac com/mycorp.foo/MyClass.java
生成/com/mycorp.foo/MyClass.class
,但这不起作用:
$ java com.mycorp.foo.MyClass
Exception in thread "main" java.lang.NoClassDefFoundError: com/mycorp/foo/MyClass
Caused by: java.lang.ClassNotFoundException: com.mycorp.foo.MyClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
这表明源树不必与对象文件树匹配
javac
正是因为这个原因,让任何事情都发生了,但是java
将要求目录结构遵循每个点分隔包名元素有一个子目录的标准。类文件顶部提到的打包结构与编译关系不大,与运行时类加载关系更大
package com.sa.test.me.yes.no;
public class Test{
public static void main(String[] args){
System.out.println("Hello");
}
}
java test.java
)
二,。在类加载时,包的组织更为重要。类加载器将始终根据包结构在文件夹中搜索类。因此,当您试图运行程序时,类加载器会根据包结构在文件夹中搜索类文件。
javac
对输入位置非常“开放”。它没有强制执行正确放置源文件的规则。理论上,您可以将所有Java源文件(来自不同的包)放在同一个目录中。这不是个好主意,但你可以<但是,代码>java确实需要遵循规则。所以不是:目录名应该是com/mycorp/foo
。对。必须重新修改目录结构,否则将麻烦的“.”替换为“u”等。Java希望在x/y/z路径的程序包x.y.z中找到一个对象,我想不出任何方法可以绕过它。@JoachimSuer您应该将注释写入一个答案中。它可能会编译或给出编译错误,具体取决于使用的Java编译器。看见
package com.sa.test.me.yes.no;
public class Test{
public static void main(String[] args){
System.out.println("Hello");
}
}