java的package和命令行编译问题

今天在看《maven实战》的时候,32页的代码引起了我的注意,test代码和package和main代码的package路径是一样的,这样可以吗?原先我对package的理解是package里面的各层路径应该是对应文件系统的路径层次的。出于好奇,我进行了一系列的实验,终于弄明白 了package的意义。

(1)错误:找不到或者无法加载主类

我在HelloWorld\main\com\wuxi下建立以HelloWorld.java的文件,java文件的第一句是:package com.wuxi; 我用命令行切换到路径下HelloWorld\main\com\wuxi,使用javac命令编译,成功!看到 了生成的class文件,然后我在当前路径下使用java HelloWorld,结果显示错误:找不到或者无法加载主类的错误!

好气!什么情况呢?百度了一下,把java文件的第一句package注释起来,重新编译运行,一切正常!

看来错误一定是package这一句导致的。

(2)javac -d . HelloWorld.java

百度了一下,这个命令可以解决我的问题,果然运行后在wuxi下除了HelloWorld.java,还多了 com\wuxi\HelloWorld.class这个文件。javac的这个参数可以在java源代码文件所咋目录中自动按照package的路径建立目录结构,如果不带-d和.的参数,就直接在java源文件所在目录生成class文件。然后我在HelloWorld\main\com\wuxi下使用 java com.wuxi.HelloWorld,一切正常运行!然后我切换到HelloWorld\main\com\wuxi\com\wuxi\下,运行java com.wuxi.HelloWorld,运行java HelloWorld都会报找不到或者无法加载主类的错误!

(3)再次尝试

我把HelloWorld.java移动到HelloWorld\main\路径下,然后再次javac不带参数编译,一切正常,我另找了一个文件路径,建立文件目录结构target\com\wuxi,把class文件复制进去,在target路径下运行java com.wuxi.HelloWorld,一切正常!

(4)结论

package语句指定的是编译好的class文件的包路径,和java源文件所在的路径没关系!源文件所在路径可以不按照package的目录层次;

如果java源文件有package语句,那么生成的class文件必须位于package指定的目录层次才能正确编译;

编译源文件带有package语句的class文件,必须位于整个包的最外层目录的父目录下,使用java命令应该按文件层次和包名写全路径才能正确编译;

在IDE中之所以省略了这些麻烦,是因为IDF自动把java源文件和编译后的class文件分离开了,比如Maven的class文件都会按照我们指定的包名放在target\classes文件夹中。里面的目录结构就是我们指定的package路径,因此我们只需要在源文件中把目标类好测试类指定同一个package语句,使用mvn test的时候因为两个class位于同一个包路径下,就可以正常运行,不会出现找不到类class文件的尴尬啦!不得不说各种项目管理工具还是很强大的,省去了我们很多麻烦!

你可能感兴趣的:(JAVA)