&引用;包xxx.util不存在;在java项目中使用cmake时出错

&引用;包xxx.util不存在;在java项目中使用cmake时出错,java,makefile,cmake,packages,manifest,Java,Makefile,Cmake,Packages,Manifest,我必须为一门课程编写一个java项目,我们的教授要求我们使用CMake作为构建工具。 在我的入口点(主类)中,我想使用位于另一个包中的类。在试图编译它时,我得到了以下错误消息(附在下面) 在Foo.java中使用此通配符导入 import xxx.util.*; 帮助,但我相信这不是实现我目标的最优雅的方式 我不知道如何解决这个问题,因为使用另一个构建工具(maven)或手动编译它都没有问题。但是由于我必须使用CMake,我希望任何人在使用这种项目设置时都会遇到类似的问题,并且能够帮助我 我在

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

在Foo.java中使用此通配符导入

import xxx.util.*;
帮助,但我相信这不是实现我目标的最优雅的方式

我不知道如何解决这个问题,因为使用另一个构建工具(maven)或手动编译它都没有问题。但是由于我必须使用CMake,我希望任何人在使用这种项目设置时都会遇到类似的问题,并且能够帮助我

我在下面列出了所有相关的项目信息(结构、受影响的类、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,而此时还没有编译

如果您切换顺序,您可以让它毫无问题地工作,这就是在Foo.java之前构建Bar.java

总而言之,如果您需要使用make文件来保存所有实用程序类,并且通常所有类与make文件顶部的其他包/类的依赖性都很小,那么这是一个好主意,以便将此类问题降至最低

现在,要回答为什么Maven或javac没有遇到这个问题,在前者的情况下,它是一个构建工具,因此它无法独自解决所有这些问题。对于后者,我想您已经编译了这两个类,这就是它工作的原因

我希望以上能解决你的问题