【问题标题】:IntelliJ: How to use external JAR's as a library, when the JAR's have no packagesIntelliJ:当 JAR 没有包时,如何将外部 JAR 用作库
【发布时间】:2014-11-21 21:04:56
【问题描述】:

此问题与为 Coursera 上提供的普林斯顿算法 2 课程设置 IntelliJ 环境有关。

我正在尝试将外部库作为 JAR 导入到我的项目中。我可以通过Project Structure -> Libraries -> New Project Library (the green plus sign) 从项目结构菜单中添加 JAR。现在我在srcWordNet.java 下有一个类,但我只能使用默认包(即无包)访问我的外部库。我想创建包来组织我的代码,但是如何从包中导入外部库?是否有直接导入 JAR 的简单解决方案,或者我可以使用 Maven 或 Grails?为我的所有选项提供一个简单的答案会很棒。

我有以下项目结构,带有src 目录、src/assignemnt1 包和External Libraries/stdlib/stdlib.jar 外部库:

我的类使用外部库WordNet.java,代码如下:

public class WordNet {

    // constructor takes the name of the two input files
    public WordNet(String synsets, String hypernyms) {
        In read_synsets = new In(synsets);
        read_synsets.hasNextLine();

    }
}

其中Instdlib.jar 下的一个类。在默认包下,我可以使用In,无需导入。不幸的是,如果我在src/assignment1 下(在assignment1 包内)有WordNet.java,我似乎无法导入In,并且IntelliJ 也没有提供导入建议。有没有办法在WordNet.java 中使用stdlib.jar,在src/assignment1 包内?还是我必须使用默认包?

【问题讨论】:

    标签: java maven grails intellij-idea dependency-management


    【解决方案1】:

    Java language specification 禁止从未命名或默认包中导入任何内容。

    未命名包中的类型(第 7.4.2 节)没有规范名称,因此每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,并且(b ) 无法导入未命名包中类型的静态成员。因此,第 7.5.1 节、第 7.5.2 节、第 7.5.3 节和第 7.5.4 节都要求在尝试在未命名的包中导入类型(或其静态成员)时出现编译时错误。

    为了在不修改库的情况下从默认包外部访问这些类,您需要使用反射。

    另外,当你的类在默认包中时你不需要导入的原因是因为你不需要在同一个包中导入类。

    【讨论】:

      【解决方案2】:

      恐怕这是不可能的。具体来说,您不能将默认包“导入”到命名包中。由于您使用的库在默认包中具有其类,因此如果您想使用该库,您唯一的办法就是也使用默认包。

      当然,您可以将库的类移动到一个包中,但这是另一回事。

      【讨论】:

      • 如果我将库的类移动到一个包中,是否会涉及更改 JAR 本身?我不想改变 JAR 的。也许我可以使用 Maven 导入 3rd 方 jars?
      • 导入对于不同的结构意味着不同的东西。导入 JAR(通过 maven 或任何其他方式)意味着您使该 JAR 中的所有类都可用于类加载器。导入一个类(使用import 关键字)意味着您正在导入的任何内容都可用于该类。因此,导入 JAR 将无济于事,因为其中的类包仍然只是默认包。
      • 感谢您的澄清。当我的类也在默认包中时,为什么我不需要从 JAR 的默认包中“导入”类?共享默认包的类是否被认为在整个项目中的相同“空间”中,无论它们是在 JAR 内部还是外部?从您的解释来看,默认包似乎是一个“特殊空间”,不能在默认包之外的任何地方引用,对吗?
      • 是的,也不是。它的工作方式是包 A 中定义的任何类都可以“看到”该包中的任何其他类(有一些限制 - 请参阅范围规则)。默认包是一种特殊情况,您无法选择查看其中的类,您可以使用 import 语句对任何其他包执行此操作。
      猜你喜欢
      • 2011-08-27
      • 2014-09-27
      • 2018-03-22
      • 2011-02-24
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多