Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
名称中带有点的Java包文件夹_Java_Classpath - Fatal编程技术网

名称中带有点的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
将要求目录结构遵循每个点分隔包名元素有一个子目录的标准。

类文件顶部提到的打包结构与编译关系不大,与运行时类加载关系更大

  • 您可以将任何packagename放入并编译它。e、 g.以下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");
     }
    
      }