Java编译,包和相对路径

时间:2011-10-28 00:43:51

标签: java compilation packages relative jgrasp

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

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

 javac -g ch01\stacks\ArrayStack.java

并且运行输出也出现类似。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

jGRASP的行为正是正常行为。 Java类文件(包括源类和已编译的类)都存在于镜像其包名称的文件层次结构中。任何Java IDE或命令行构建工具(AntMavenGradle,等等)都能理解这一点,并且会相应地运行。

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

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

简而言之:不要做你所问的事。我认为没有充分的理由这样做。 (这并不意味着不是任何好的理由,但我......高度怀疑。)甚至可以使用相对固定的-d文件来构建Java项目;一个更好的解决方案,你提出的建议,但仍然是一个可怕的想法。

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