"package xxx.util does not exist" 在 java 项目中使用 cmake 时出错

"package xxx.util does not exist" error while using cmake in a java project

我必须为课程编写一个 java 项目,我们的教授要求我们使用 CMake 作为构建工具。 在我的入口点 (main class) 中,我想使用位于另一个包中的 class。在尝试编译它时,我收到以下错误消息(附在下面)。

在 Foo.java

中使用此通配符导入
import xxx.util.*;

有帮助,但我确信这不是实现我目标的最优雅方式。

我无法弄清楚如何解决这个问题,因为我使用另一个内置工具 (maven) 或手动编译它没有遇到任何问题。但是因为我必须使用 CMake,所以我希望外面的任何人在使用这种项目设置时遇到类似的问题并且能够帮助我。

我在下面列出了所有相关的项目信息(结构、受影响的 classes、CMakeLists.txt、...)。

请随时在评论部分提问,以消除任何歧义。

谢谢!

相关项目结构:

.
|-- CMakeLists.txt
|-- build
|-- resources
|   |-- MANIFEST.MF
|   \-- sqlite.jar
|-- src
|   \-- xxx
|       |-- gui
|       |   \-- Foo.java
|       \-- util
|           |-- Bar.java

Foo.java:

package xxx.gui;

import xxx.util.Bar;

public class Foo {

    public static void main(String[] args) {
        Bar bar = Bar.getBar(); //singleton 

    }
}

Bar.java:

package xxx.util;

public class Bar {

}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5) 
project(xxx LANGUAGES Java)
find_package(Java 1.8 REQUIRED COMPONENTS Development)
include(UseJava)
file(GLOB_RECURSE SOURCES "src/*.java") 
file(GLOB_RECURSE JARS "resources/sqlite*.jar")
add_jar(DataFX ${SOURCES} MANIFEST ./resources/MANIFEST.MF INCLUDE_JARS ${JARS}
ENTRY_POINT xxx.gui.Foo)

MANIFEST.MF:

Class-Path: ../resources/sqlite.jar

相关错误信息:

gui/Foo.java error: package xxx.util does not exist
import xxx.util.Bar;
                  ^
gui/Foo.java error: cannot find symbol
        Bar bar = Bar
        ^
  symbol:   class Bar
  location: class Foo
...

得到这个错误似乎很合乎逻辑。与其他 make 实用程序一样,CMake 在很大程度上取决于 类 的编译顺序。

从您附加的 makefile 中可以明显看出 make 的入口点是 'xxx.gui.Foo' 包问题是尽管 Foo.java 对 Bar.java 有依赖性,但目前还没有尚未编译。

如果您切换顺序,您可以毫无问题地运行它,即 Bar.java 在 Foo.java 之前构建。

总而言之,如果您需要使用 make 文件来保留所有实用程序 类 并且通常所有 类 与其他 packages/classes 的依赖性尽可能小,这是一个好主意] 在你上面制作文件,以尽量减少此类问题。

现在,回答为什么 Maven 或 javac 没有遇到这个问题,如果是前者,它是一个构建工具,因此它无法自行解决所有这些问题。对于后者,我想您已经编译了两个 类,因此它有效。

希望以上内容能解决您的问题。