如何使用javac编译java包结构

如何使用javac编译java包结构,java,command-line,compilation,package,javac,Java,Command Line,Compilation,Package,Javac,我正在尝试编译(从命令行)一个java包,该包导入我自己的另一个包。我遵循了一个错误,但是当我试图编译最终的java文件(CallPackage.java)时,似乎遇到了一个错误 以下是文件结构: + test_directory (contains CallPackage.java) -> importpackage -> subpackage (contains HelloWorld.java) 下面是CallPackage.java: /// CallPa

我正在尝试编译(从命令行)一个java包,该包导入我自己的另一个包。我遵循了一个错误,但是当我试图编译最终的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!!");
  }
}
尝试的步骤
  • 转到子包并使用
    $javac HelloWorld.java
    编译HelloWorld.java
  • 转到test_目录并使用
    $javac CallPackage.java
    编译CallPackage.java
  • 这给了我最后一个命令的错误:

    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
    

    如何编译这两个包?非常感谢你的帮助

    您确定导入包/子包在您的类路径中吗

    -cp路径或类路径

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

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

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

    (1)首先编译代码

    javac-d importpackage.subpackage.HelloWorld

    (2) 然后编译CallPackage.java


    javac CallPackage.java

    问题是需要为每个命令(javac和java)设置类路径:

    尝试的步骤

  • 不要转到子包,而是从顶层编译HelloWorld.java:

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

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

    $javac-cp。CallPackage.java

  • 同时使用类路径运行文件:

    $java-cp。呼叫包

  • 注意:运行“$java CallPackage”将出现错误“错误:无法找到或加载主类CallPackage”


    总之,在每个步骤中,必须指定类路径。这样运行之后,它就工作了。

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

    + 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类src/com/example/model/BeerExpert.java


    然后:
    -->javac-d类src/com/example/web/BeerSelect.java


    结果是:
    -->。。。错误:包com.example.model不存在

    因此,我知道单独编译多个类在这种情况下不起作用


    在谷歌受苦之后,我找到了一个非常简单的方法来解决这个问题:
    只需一次性编译:

    --> 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
    

    希望对您有所帮助。

    删除您的软件包文件夹(将代码粘贴到其他文件夹后),然后在cmd中找到当前代码所在的文件夹,然后尝试javac-d。Helloworld.java(这也将创建Helloworld类和子包),并在编译运行代码后为您的主功能代码ie Callpackage.java尝试相同的方法尝试java Callpackage

    这是一个古老的主题,但Google已经将我带到了这个站点。为了完整性,我想在@Vĩnh Th中添加一点ụy Trần关于如何在编译到自定义文件夹后运行主类的回答。虽然现在看起来很琐碎,但我花了一些时间才把它做好

    为了运行项目,还需要指定类的路径:

    java -classpath <directory> your.package.name.classname
    

    我希望它能帮助一些人,因为我花了一些时间来解决它。

    这将帮助你。最好使用像Eclipse这样的IDE来执行java程序,因为它可以自动创建包?当我在test_目录和subpackage目录中尝试此操作时,我得到一个错误,它无法找到此目录。因为您在子包中编译HelloWorld。我猜@Jazzy Josh您是说当我执行步骤2时,我需要使我的类路径指向步骤1中的.class文件所在的目录。当我这样做的时候,我运行了:$javac-cp importpackage/subpackage/CallPackage.java,但是我得到了这个错误:请删除或者确保它出现在类路径的正确子目录中。HelloWorld h2=新HelloWorld();^2个错误问题最终是类路径。我需要用“-cp”运行所有java和javac命令。例如:$javac-cp。java和$java-cp。CallPackage@JazzyJosh请看一下,我想我用了一种错误的方式使用了
    -cp
    ,我不知道如何纠正我的错误。谢谢。这绝对是最好的答案!其他答案显然会导致预期的问题,因为我无法在没有其他答案的情况下编译一个答案!他也有类似的问题。Vĩnh Thụy Trần的解决方案工作得很好:在项目的顶层使用命令提示符,包括所有在同一javac行上具有路径的类,谁会想到这么简单!如果您的类彼此引用,那么这在Windows上不起作用。。。
    java -cp <directory> your.package.name.classname
    
    java -cp classes com.example.web.BeerSelect