问题 如何使用javac编译java包结构


目标

我正在尝试编译(从命令行)一个java包导入我自己的另一个包。

之前的工作

我正在关注以下在线教程: 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


2270
2017-10-15 13:32


起源

这会对你有所帮助。 thejavageek.com/2013/07/21/... - Prasad Kharkar
最好使用像Eclipse这样的IDE来执行java程序,因为它可以自动创建包。 - shasi kanth


答案:


你确定importpackage / subpackage在你的类路径中吗?

-cp path或-classpath path

指定在何处查找用户类文件,以及(可选)注释处理器和源文件。此类路径将覆盖CLASSPATH环境变量中的用户类路径。如果既未指定CLASSPATH,-cp也未指定-classpath,则用户类路径由当前目录组成。有关详细信息,请参阅设置类路径。

如果未指定-sourcepath选项,则还会在用户类路径中搜索源文件。

如果未指定-processorpath选项,则还会在类路径中搜索注释处理器。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html


3
2017-10-15 13:38



我猜@jazzy Josh,你说当我执行第2步时,我需要让我的类路径指向步骤1中.class文件的目录。当我这样做时,我运行了这个:$ javac -cp importpackage / subpackage / CallPackage.java但我收到此错误:请删除或确保它出现在类路径的正确子目录中。 HelloWorld h2 = new HelloWorld(); ^ 2错误 - Pswiss87
这个问题最终成了阶级路径。我需要使用“-cp”运行所有java和javac命令。例如:$ javac -cp。 CallPackage.java和$ java -cp。 CallPackage - Pswiss87


问题是需要为每个命令(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”

总之,在每个步骤中,必须指定类路径。它运行后就可以了。


6
2017-10-15 20:02



$ javac -cp。 CallPackage.java在Yosemite上工作 - timv


(1)首先编译代码

javac -d importpackage.subpackage.HelloWorld

(2)然后编译CallPackage.java

javac CallPackage.java


0
2017-10-15 13:46



我应该从第一步运行cmd的目录是什么?当我在test_directory和subpackage目录中尝试这个时,我收到一个错误,说它找不到这个目录。 - Pswiss87
因为你在子包里面编译了HelloWorld。 - Dev


我的情况也一样。我通过同时编译类来接管它。
例如,这是我的项目:

+ 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

希望有所帮助。


0
2018-01-05 08:30