【问题标题】:Java Compilation, Packages, and Relative PathsJava 编译、包和相对路径
【发布时间】:2011-12-16 23:09:51
【问题描述】:

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

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

 javac -g ch01\stacks\ArrayStack.java

和运行输出类似。

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

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

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

也就是说,有没有什么方法可以检测编译所需的顶层目录(上例中的ch01),而无需通过程序查找package?

【问题讨论】:

  • 那是正常行为——你想模拟什么(以及为什么)?
  • 文件系统目录结构总是反映java中的包结构。这个是正常的。见download.oracle.com/javase/1.4.2/docs/tooldocs/windows/…
  • @Dave Newton 我的目的是让我的 Notepad++、gedit 等编译脚本像 jGRASP 那样无缝地检测包结构。除了在程序中寻找package之外还有什么方法可以做到这一点?
  • @M.Cain 移动回答;太长了。

标签: java compilation package relative-path jgrasp


【解决方案1】:

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

jGRASP 的行为是完全正常的行为。 Java 类文件,包括源类和编译类,都存在于一个文件层次结构中,该层次结构反映了它们的包名称。任何 Java IDE 或命令行构建工具(Ant、Maven、Gradle,等等)都理解这一点,并采取相应的行为。

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

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

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

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

【讨论】:

  • 所以看起来好像没有直接的方法。感谢您的帮助,我只是想让我的严格编译脚本更具可扩展性。我会投票,但似乎我没有足够的声誉。
  • @M.Cain 你可以accept,但我不相信我回答了这个问题。在脚本中,您需要做的就是一个 find 和 xargs 以及一些文件名操作。我不能推荐你不这样做。
  • 好吧,我会坚持使用 IDE 来处理程序包。还有一件事,jGRASP 是如何输出相对包结构的呢?这就是让它看起来好像有一种更直接的方法可以将它包含在脚本中的原因。
  • @M.Cain 所有程序都应该存在于包中;避免使用默认包。就像我说的,-d 选项会将 Java 类文件放在相对于指定目录的包结构中。同样,源文件应该存在于包/文件层次结构中,正如我确信它们在 jGRASP 中所做的那样。这并不难,只是重复努力是没有用的。一个简单的 ant 文件只有几行,并且已经为您完成了所有这些工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2014-03-30
  • 2015-06-23
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多