如何使用javac编译java包结构
目标
我正在尝试编译(从命令行)一个java包导入我自己的另一个包。
之前的工作
我正在关注位于以下url的教程: http : //www.roseindia.net/java/master-java/createsubpackage.shtml
但是当我尝试编译最终的java文件(CallPackage.java)时,我似乎遇到了错误。
示例的文件结构
这是文件结构:
+test_directory (contains CallPackage.java) -> importpackage -> subpackage (contains HelloWorld.java)
码
这是CallPackage.java
/// CallPackage.java import importpackage.subpackage.*; class CallPackage{ public static void main(String[] args){ HelloWorld h2=new HelloWorld(); h2.show(); } }
这是HelloWorld.java
///HelloWorld.java package importpackage.subpackage; public class HelloWorld { public void show(){ System.out.println("This is the function of the class HelloWorld!!"); } }
尝试过的步骤
-
转到子包并编译HelloWorld.java
$ javac HelloWorld.java
-
转到test_directory并编译CallPackage.java
$ javac CallPackage.java
编译错误
但我在最后一个cmd上收到错误:
CallPackage.java:1: package importpackage.subpackage does not exist import importpackage.subpackage.*; ^ CallPackage.java:4: cannot find symbol symbol : class HelloWorld location: class CallPackage HelloWorld h2=new HelloWorld(); ^ CallPackage.java:4: cannot find symbol symbol : class HelloWorld location: class CallPackage HelloWorld h2=new HelloWorld(); ^ 3 errors
非常感谢您的帮助!
-Peter
你确定importpackage / subpackage在你的类路径中吗?
-cp path或-classpath path
指定在何处查找用户类文件,以及(可选)注释处理器和源文件。 此类路径将覆盖CLASSPATH环境变量中的用户类路径。 如果既未指定CLASSPATH,-cp也未指定-classpath,则用户类路径由当前目录组成。 有关详细信息,请参阅设置类路径。
如果未指定-sourcepath选项,则还会在用户类路径中搜索源文件。
如果未指定-processorpath选项,则还会在类路径中搜索注释处理器。
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
问题是需要为每个命令(javac和java)设置类路径:
尝试过的步骤
-
而不是去subpackage,从top_level编译HelloWorld.java:
$javac -cp . importpackage/subpackage/HelloWorld.java
-
以相同的方式编译CallPackage.java:
$javac -cp . CallPackage.java
-
使用类路径运行文件:
$java -cp . CallPackage
注意 :运行“$ java CallPackage”将给出错误“错误:无法找到或加载主类CallPackage”
总之,在每个步骤中,必须指定类路径。 它运行后就可以了。
(1)首先编译代码
javac -d importpackage.subpackage.HelloWorld
(2)然后编译CallPackage.java
javac CallPackage.java
我的情况也一样。 我通过同时编译类来接管它。
例如,这是我的项目:
+ beerV1 -> classes -> src -> com -> example -> model -> BeerExpert.java -> web -> BeerSelect.java
BeerExpert.java:
package com.example.model; import ... public class BeerExpert{ ... }
BeerSelect.java:
package com.example.web; import com.example.model.*; import ... public class BeerSelect { ... }
如您所见: BeerSelect.java正在尝试导入com.example.model包中的类。
第一次,我首先通过命令编译BeerExert.java :
--> javac -d classes src/com/example/model/BeerExpert.java
然后:
--> javac -d classes src/com/example/web/BeerSelect.java
结果是:
-->... error: package com.example.model does not exist
所以,我知道在这种情况下单独编译多个类是行不通的。
在google遭受痛苦之后,我发现这种解决问题的方法非常简单:
只需一次编译:
--> javac -d classes src/com/example/model/BeerExpert.java src/com/example/web/BeerSelect.java
最后,这是我得到的:
+ beerV1 -> classes -> com -> example -> model -> BeerExpert.class -> web -> BeerSelect.class -> src -> com -> example -> model -> BeerExpert.java -> web -> BeerSelect.java
希望有所帮助。