当其他包中有Java文件时,如何编译多个Java文件?

Posted

技术标签:

【中文标题】当其他包中有Java文件时,如何编译多个Java文件?【英文标题】:How to compile multiple Java files when there are Java files in other packages? 【发布时间】:2013-06-17 04:41:33 【问题描述】:

我正在编译一个目录 (javac *.java) 中的多个文件,但是当我尝试这样做时遇到了问题。

我收到编译错误,提示 javac 找不到对象的符号。

我有多个包,其中包含运行主程序所需的 Java 文件。但似乎试图一个一个地编译这些是行不通的。它在我的 IDE 中运行良好,但我有兴趣了解它是如何通过 命令提示符 完成的。

主程序位于驱动程序文件夹中。我尝试按依赖顺序编译文件,但没有成功。

【问题讨论】:

如果在argfile 中你有所有要编译的文件的列表,你可以运行javac @argfile。如果您使用其他库,则必须添加它们的类路径。 当我做类似编辑类路径名(在这种情况下)的事情时,我应该在哪里做以及如何做?我听说这是在清单文件中完成的,但是我知道它也可以在操作系统设置中完成。 您可以通过-classpath 选项添加类路径依赖项,例如:javac -classpath \examples;\lib\Banners.jar \examples\greetings\Hi.java。看看docs.oracle.com/javase/7/docs/technotes/tools/windows/… 和docs.oracle.com/javase/7/docs/technotes/tools/windows/…。 【参考方案1】:

Javac documentation 提供所有必要的信息。但是,使用 Ant 或 Maven 进行命令行构建可能很有用。

This 页面提供了一个很好的例子,说明先使用 javac,然后使用 Ant 来构建一个简单的项目。


这是一个示例项目,如何使用 javac 进行编译。

项目的树形结构是这样的:

   .
    ├── build
    └── src
        ├── attacks
        ├── drivers
        │   └── Driver.java
        └── exceptions
            └── MyException.java

有两个特殊的目录——build 用于包含已编译的类,src 用于包含源文件(可能位于不同的子目录——包中)。

以下命令编译整个项目并将结果放入build目录。

javac -sourcepath src -d build src/**/*.java

-sourcepath src 指定目录src 作为编译器可以找到所有源代码的地方。 -d build 选项告诉编译器将编译后的文件放在哪里。

选项src/**/*.java 告诉编译器实际编译哪些文件。在这种特定情况下,它告诉 javac 向下查找两个级别并选择该级别的所有 *.java。

如果在不同级别有*.java 文件,则需要指定文件列表。为此,可以将此类列表创建为外部文件,并将此文件作为javac 的输入选项传递。

这是如何在 Linux/Unix 下完成的:

find -name "*.java" > source.txt

上面的命令创建文件 source.txt,其中包含找到的 *.java 文件的完整路径。对于此示例,它包含:

./src/drivers/Driver.java
./src/exceptions/MyException.java

为了编译带有刷新到source.txt的源文件列表的项目,可以使用以下命令:

javac -d build @source.txt

请注意,最后指定的@source.txt 告诉编译器在哪里查找源文件列表。另请注意,-sourcepath 选项可以省略。

这是运行上述命令后目录结构的变化。

.
├── build
│   ├── drivers
│   │   └── Driver.class
│   └── exceptions
│       └── MyException.class
└── src
    ├── attacks
    ├── drivers
    │   └── Driver.java
    └── exceptions
        └── MyException.java

可以看出,build 目录现在包含各个包中已编译的类文件。

并且,如果您想运行它,例如,假设 Driver 具有方法 main,则以下命令将执行该程序。

java -cp .:build:**/*.class drivers.Driver

请注意,文件分隔符 :(冒号)在 Unix 下使用,对于 Windows 将其更改为 ;(分号)。

【讨论】:

我会查看文档。我遇到的另一个问题是,当我得到 .jar 文件时,它不会像在 IDE 中那样运行。图标只是闪烁然后什么都不做。 @CanIHaveSomeChange 最好将这个其他问题注册为不同的问题。项目编译成功了吗? 我还没有让程序编译。发生的事情在原始帖子中。 @CanIHaveSomeChange 请使用项目结构扩展您的问题,包括 java 文件名。这样才有可能为您提供准确的答案。 无需在另一个文件中收集 java 文件名。只需使用以下示例:javac -d compiled $(find src -name *.java)。来源:***.com/a/3512668/435605【参考方案2】:

我正在编译一个目录中的多个文件(javac *.java)

已经错了。只有当 Java 类不在包中时,它才能正常工作。正确的做法如下,其中src是你所有包目录的根目录的名称:

cd src
javac package1/package2/*.java
javac package3/package4/package5/*.java

等等,无论你的包/目录布局是什么。每个javac 命令行将编译命名目录中的所有文件它所依赖的其他包/目录中的所有.java 文件,这些文件尚未编译或已过期。

请参阅javac 的工具文档。

【讨论】:

这正是我想要的。非常感谢! :)【参考方案3】:

两个选项:

1) 使用命令行指定所有要编译的文件

2) 创建一个包含所有文件名的文件(可能是 find 的输出),然后运行 ​​javac @argfile

【讨论】:

你的意思是把所有的java文件放到一个目录下?我会尝试将此作为实验,但这不是最终解决方案。 不,他没有说将所有java文件放在一个目录中。不要那样做,这行不通。 我不确定我是否做对了,但是在你第一步之后尝试运行程序后我得到了这个错误:好的,我试过了,现在我得到了一个运行时错误上面写着“java.lang.NoClassDefFoundError: ProgramName 我不知道如何执行第二步;我阅读了其他人在此线程中推荐的 Java 文档,但我不明白如何使用它。 NoClassDefFoundError 来自于将所有 .java 文件放在同一个目录中,没有人告诉你这样做。 我的原始设置也出现了 NoClassDefFoundError。

以上是关于当其他包中有Java文件时,如何编译多个Java文件?的主要内容,如果未能解决你的问题,请参考以下文章

java包中的多个主要方法

如何在 Java 可执行文件 .jar 中启动多个主程序?

java 执行 jar 包中的 main 方法

如何替换java项目的框架jar包中的一个文件?

在linux下怎么编译和运行java程序

java中,怎么在一个包中引用另一个包的同名类