【问题标题】:I can't import a package from another directory我无法从另一个目录导入包
【发布时间】:2019-08-14 09:18:37
【问题描述】:

我想创建两个包:一个包含特定于问题的类和方法,另一个包含一些典型的数学工具。 我将它们表示为“maxim.main_package”和“maxim.algebra”。 由于某种原因,我无法将代数包导入主包。 请帮忙。

由于代数包不依赖主包,我已经通过命令行成功将.java文件编译成.class。 .java 文件以“package maxim.algebra;”开头。 现在我想编译以“package maxim.main;”开头的主 .java 文件。其次是“导入代数。*;” .java 文件的路径分别是:

1) maxim\main\main.java
2) maxim\algebra\algebra.java
I run "javac maxim\main\main.java" command from maxim directory. 
It fails saying:

    `error: cannot access Algebra
    Algebra.matrix3x3 R = Algebra.some_method(parameters)
    bad class file: .\algebra\Algebra.class
    class file contains wrong class: maxim.algebra.Algebra`

【问题讨论】:

  • 包含类Algebra的文件必须命名为Algebra.java
  • 我相信你也应该导入maxim.algebra.*,而不是algebra.*
  • Lutz,文件名为 Algebra.java。罗杰,不,事实上,如果我导入 maxim.algebra.*,则根本找不到包及其类。使用 import algebra.* 可以看到该类。
  • 这里有些不一致。你说你从maxim 目录运行javac maxim\main\main.java。那应该行不通。你的意思是javac main\main.javamaxim 作为当前目录吗?如果是,上一级目录,在 main.java 中导入maxim.algebra.* 并运行javac maxim\main\main.java

标签: java import package


【解决方案1】:

包名和目录结构需要匹配。案件很重要。然后还需要在classpath 上提供这些软件包。默认情况下,当前目录位于类路径中。但是可以使用环境变量CLASSPATH 更改类路径。如果此变量已定义且.(当前目录)不在其中,则当前目录将不在类路径中。类路径也可以用参数-classpath或简称-cp来设置。另见Setting the Class Path

以下是关于如何将类放入包中以及从不同包中导入类的简短指南:

您有两个包,maxim.mainmaxim.algebra。我们从当前目录开始,在这里我们创建两个以包名命名的目录,maxim\mainmaxim\algebra

> mkdir maxim\main maxim\algebra
> dir
2019-08-14  12:39    <DIR>          .
2019-08-14  12:39    <DIR>          ..
2019-08-14  12:39    <DIR>          maxim

> dir maxim
2019-08-14  12:39    <DIR>          .
2019-08-14  12:39    <DIR>          ..
2019-08-14  12:41    <DIR>          algebra
2019-08-14  12:46    <DIR>          main

>

我们创建两个类,Main.java,文件名为maxim\main\Main.java,内容如下:

package maxim.main;

import maxim.algebra.Algebra;

public class Main {
    public static void main(String... args) {
        Algebra algebra = new Algebra();
        System.out.println(algebra.sayHello() + " World");
    }
}

Algebra.java,文件名为maxim\algebra\Algebra.java,内容如下:

package maxim.algebra;

public class Algebra {
    public String sayHello() {
        return "Hello";
    }
}

在没有改变活动目录的情况下,我们先编译Algebra这两个类:

> javac -cp . maxim\algebra\Algebra.java maxim\main\Main.java

>

我们指定-cp . 覆盖任何可能设置的CLASSPATH 环境变量。

编译后目录结构如下:

.\
  maxim\
    main\
      Main.class
      Main.java
    algebra\
      Algebra.class
      Algebra.java

现在我们可以运行Main 类:

> java -cp . maxim.main.Main
Hello World

>

【讨论】:

  • 当我必须从 maxim 文件夹编译 Main.java 时,这一切都已经完成了。错误说:包 maxim.algebra 不存在
  • 好的。试试javac -cp . maxim\main\Main.java。如果成功,java -cp . maxim.main.Main
  • 你说“从 maxim 文件夹编译 Main.java”。你的意思是你在运行命令之前切换到那个目录(maxim)?
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2020-10-23
  • 2019-07-03
相关资源
最近更新 更多