如何使用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!!"); } } 

尝试过的步骤

  1. 转到子包并编译HelloWorld.java

    $ javac HelloWorld.java

  2. 转到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)设置类路径:

尝试过的步骤

  1. 而不是去subpackage,从top_level编译HelloWorld.java:

    $javac -cp . importpackage/subpackage/HelloWorld.java

  2. 以相同的方式编译CallPackage.java:

    $javac -cp . CallPackage.java

  3. 使用类路径运行文件:

    $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 

希望有所帮助。