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

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

 javac -g ch01\stacks\ArrayStack.java


运行结果显示类似。

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

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

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

也就是说,是否有任何方法可以检测编译所需的顶层目录(在前面的示例中为ch01),而不必在程序中查找package

最佳答案

我仍然不确定您想要什么,因此不适合置评。

jGRASP的行为恰好是正常行为。 Java类文件(包括源类和已编译类)都位于反映其包名称的文件层次结构中。任何Java IDE或命令行构建工具(AntMavenGradle,无论如何)都可以理解这一点并做出相应的反应。

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

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

简而言之:不要做您想问的事情。我认为没有充分的理由这样做。 (这并不意味着没有任何充分的理由,但是我……对此表示高度怀疑。)甚至可以使用相对罐头的make文件来构建Java项目。更好的解决方案,但仍是一个可怕的主意。

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

08-15 19:01
查看更多