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