我想知道是否有任何方法可以让我们使用相对路径导入类中的包。
要设置一个类比,在html中可以使用相对路径来设置超链接。
例如,给定以下文件结构:
Folder: "A"
|
|____________ Folder: "B"
| |
| |
| |
| |_________ File html: "Link.html"
|
|
|
|________ File html: "Index.html"
因此,在文件"Link.html"中,我可以设置这个超链接:
<!DOCTYPE html>
<html>
<head>
<title>Link</title>
</head>
<body>
<main>
<h1>You are in the file "Link"</h1>
<!--This would be the hyperlink-->
<a href="../Index.html"> Go to Index </a>
</main>
</body>
</html>
我的问题是:我可以创建一个包,例如在文件夹"B"中,然后从文件夹"B"中导入类到文件夹"A"中吗?我的意思是不使用"classpath"(我没有说不使用"sourcepath",因为我不确定它是如何工作的)。
Folder: "A"
|
|____________ Folder: "B"
| |
| |
| |
| |_________ File Java: "Example.java"
|
|
|
|________ File Java: "Main.Java"
此外,我可以直接在java文件中设置一个绝对路径来导入一个包,而不必通过类路径手动告诉编译器包在哪里吗?(就像html一样?)
我的意思是类似于这个例子,但当导入一个包在java:
<a href="C:\Users\Pc2\Desktop\A\Index.html"> Go to Index </a>
提前致谢;)
2条答案
按热度按时间hfyxw5xn1#
我想知道是否有任何方法可以让我们使用相对路径导入类中的包。
不支持。Java不支持。包名在定义时是完全限定的,在使用时也是完全限定的。
我的问题是:我可以创建一个包,例如在文件夹"B"中,并从文件夹"B"导入类到一个java文件中,该文件将位于文件夹"A"中?
对于OpenJDKJava工具链,以及其他任何使用相同类解析机制的工具1,文件夹名称结构必须Map到包结构,因此假设
A
上面的文件夹是(源代码或二进制)类文件夹树的根,那么Main.java
文件需要package
声明并且您的
Example.java
文件需要一个package
声明:(Note这种情况很重要,包名
A
和B
违反了Java风格。)类
Example
可以导入Main
,反之亦然,但是它们必须使用完全限定的包名来完成;即问:你可以通过一个不对应于文件/文件夹结构的类/包命名方案来欺骗编译器/运行时吗?
答:不会。Java编译器或运行时将无法找到类,或者它将检测到类的完全限定符与找到它的位置不匹配。在这两种情况下,您都会得到一个错误。
问:你可以导入文件路径名?
答:不,Java语言不允许这样做。只是......不。
我的意思是不使用"classpath"(我没有说也不使用"sourcepath",因为我不确定它是如何工作的)。
这是没有意义的。你不能"不使用"类路径。如果没有类路径,Java工具就找不到你的代码。类路径总是存在的......即使它只是当前目录;即"."。
1-据我所知,这涵盖了当前所有实际的Java实现。然而,Java实现在技术上可能(并且被Java语言规范所允许)使用一些其他机制来组织和定位源代码或二进制代码"实体"。
iqih9akk2#
对于您的第一个问题:Java包就是这样做的,但是CLASSPATH仍然在使用。默认的类加载器将在CLASSPATH下查找类,并期望它们基于包名定位。(还有其他的类加载器有不同的行为,但是大多数情况下您将使用默认的。)
关于你的第二个问题:不,你不能。如上所述,默认的类加载器将在CLASSPATH下查找你导入的任何类,并将尝试根据类的包名来定位。(同样,假设你使用默认的类加载器。)
Java包是构建代码的标准方式,并且在大多数情况下,这种结构也会复制到文件系统上(对于源文件和类文件)。