Java 编译、包和相对路径

标签 java compilation package relative-path jgrasp

在使用 jGRASP 时,我注意到包中程序的输出与正常情况略有不同,特别是程序名称似乎是从类顶部开始的相对路径。

例如,对于包含语句 package ch01.stacks; 的 Java 程序,编译输出如下所示:

 javac -g ch01\stacks\ArrayStack.java

运行输出也类似。

我想知道是否有一种相对简单的方法可以在其他程序中模拟这种行为,例如 Notepad++ 或 gedit,用户可以在其中设置脚本来编译程序。

编辑:抱歉,我忘了说我所说的编译脚本本质上是传递给 javac 的程序文件名。我宁愿不使用绝对路径,我希望我的脚本尽可能以类似于 jGRASP 的方式工作。

为了进一步阐明手头的问题,我认为使用我当前的脚本,包结构给我带来了问题,因为它是在程序的当前目录中编译的。我正在寻找一种相对于包结构来编译我的 Java 程序的方法。

也就是说,有没有什么方法可以检测编译所需的顶级目录(上一个示例中的 ch01),而不必深入研究程序以寻找 package

最佳答案

我仍然不确定你想要什么,这不适合发表评论。

jGRASP 的行为恰好是正常行为。 Java 类文件(包括源类和编译类)位于反射(reflect)其包名称的文件层次结构中。任何 Java IDE 或命令行构建工具( AntMavenGradle 等等)都能理解这一点,并据此采取行动。

如果您真的希望重新发明那些轮子,您的代码也需要这样做。如果您的 Java 源代码确实不在规范的包/文件层次结构中,那么是的,您需要查询每个文件的 package 声明的源代码,并将编译后的 .class 文件放入相应的目录。

javac-d 选项设置输出目录。编译后的类将根据它们的包名放置在正确的位置。但是,在编译时,所有导入必须在类路径中可用,无论是您自己的类,还是第三方库的类(通常在 jar 中)。

简而言之:不要按照您的要求去做。我想不出这样做的充分理由。 (这并不意味着没有任何好的理由,但我...非常怀疑。)甚至可以使用相对固定的 make 文件来构建 Java 项目;一个比你提议的更好的解决方案,但仍然是一个可怕的想法。

注意:当您运行 Java 应用程序时,类文件必须出现在预期的层次结构中,无论是打包在 jar 中(或 war) 文件,或在文件系统上。

关于Java 编译、包和相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924036/

相关文章:

Java Puzzler-这是什么原因?

java - SQL 错误 : 17008, SQLState:空

java - 为什么在二分查找中返回低位而不是高位?

java - 在java中将文件写入亚马逊s3

java - 为什么我需要对对象数组中的特定引用进行强制转换?

oracle - 有没有办法使用 ODI 场景重新创建 ODI 包?

java - java中的文件共享

c - 在 Solaris 上编译 ruby​​ 1.9.3 时出错

RStudio 学习包错误 "ERROR: compilation failed for package ' 向后移植'"

python - 通过 PyCharm 安装软件包会产生 "ValueError: source code string cannot contain null bytes"