此问题与在Coursera上为普林斯顿算法2课程设置IntelliJ环境有关。
我正在尝试将外部库(如JAR)导入到我的项目中。我可以通过Project Structure
- >从项目结构菜单中添加JAR。 Libraries
- > New Project Library (the green plus sign)
。现在我在src
,WordNet.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();
}
}
In
是stdlib.jar
下的一个类。在默认包下,我可以使用In
而无需导入。不幸的是,如果我WordNet.java
下src/assignment1
(assignment1
包内),我似乎无法导入In
,IntelliJ也没有提供导入建议。有没有办法在stdlib.jar
包中的WordNet.java
内使用src/assignment1
?或者我是否必须继续使用默认包?
答案 0 :(得分:3)
Java language specification禁止从未命名或默认的包中导入任何内容。
未命名包中的类型(第7.4.2节)没有规范名称,因此在每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,并且(b) )无法导入未命名包中类型的静态成员。因此,§7.5.1,§7.5.2,§7.5.3和§7.5.4都要求在未命名的包中导入类型(或其静态成员)的任何尝试都存在编译时错误。
为了从默认包外部访问这些类而不修改库,您需要使用反射。
此外,当您的类在默认包中时,您不需要导入的原因是因为当它们位于同一个包中时您不需要导入类。
答案 1 :(得分:1)
我担心这是不可能的。具体来说,你不能导入"默认包进入命名包。由于您使用的库在默认包中具有其类,因此您唯一的办法是使用默认包,如果您想使用该库。
当然,您可以将图书馆的课程移到一个包裹中,但这是一个不同的故事。