在使用 jGRASP 时,我注意到包中程序的输出与正常情况略有不同,特别是程序名称似乎是从类顶部开始的相对路径。
例如,对于包含语句 package ch01.stacks;
的 Java 程序,编译输出如下所示:
javac -g ch01\stacks\ArrayStack.java
运行输出也类似。
我想知道是否有一种相对简单的方法可以在其他程序中模拟这种行为,例如 Notepad++ 或 gedit,用户可以在其中设置脚本来编译程序。
编辑:抱歉,我忘了说我所说的编译脚本本质上是传递给 javac 的程序文件名。我宁愿不使用绝对路径,我希望我的脚本尽可能以类似于 jGRASP 的方式工作。
为了进一步阐明手头的问题,我认为使用我当前的脚本,包结构给我带来了问题,因为它是在程序的当前目录中编译的。我正在寻找一种相对于包结构来编译我的 Java 程序的方法。
也就是说,有没有什么方法可以检测编译所需的顶级目录(上一个示例中的 ch01),而不必深入研究程序以寻找 package
?
最佳答案
我仍然不确定你想要什么,这不适合发表评论。
jGRASP 的行为恰好是正常行为。 Java 类文件(包括源类和编译类)位于反射(reflect)其包名称的文件层次结构中。任何 Java IDE 或命令行构建工具( Ant 、 Maven 、 Gradle 等等)都能理解这一点,并据此采取行动。
如果您真的希望重新发明那些轮子,您的代码也需要这样做。如果您的 Java 源代码确实不在规范的包/文件层次结构中,那么是的,您需要查询每个文件的 package
声明的源代码,并将编译后的 .class
文件放入相应的目录。
javac
的 -d
选项设置输出目录。编译后的类将根据它们的包名放置在正确的位置。但是,在编译时,所有导入必须在类路径中可用,无论是您自己的类,还是第三方库的类(通常在 jar 中)。
简而言之:不要按照您的要求去做。我想不出这样做的充分理由。 (这并不意味着没有任何好的理由,但我...非常怀疑。)甚至可以使用相对固定的 make
文件来构建 Java 项目;一个比你提议的更好的解决方案,但仍然是一个可怕的想法。
注意:当您运行 Java 应用程序时,类文件必须出现在预期的层次结构中,无论是打包在 jar 中(或 war) 文件,或在文件系统上。
关于Java 编译、包和相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924036/