使用CMake构建Java项目时出现package xxx.util does not exist错误
嘿,我之前在课程项目里用CMake构建Java代码时也碰到过一模一样的问题——明明包结构是对的,导入特定类就报“package xxx.util does not exist”,通配符导入能凑活但总觉得不够规范。下面几个方案亲测有效,比通配符优雅多了:
1. 确保CMake正确包含所有依赖的源文件
CMake的add_jar命令不像Maven那样会自动扫描整个源码目录的包结构,如果你只把入口主类的源文件传给add_jar,它只会编译那一个文件,根本不会处理xxx.util包下的类。
解决方法很简单:要么递归扫描所有Java源文件,要么明确列出依赖的包文件。比如你的项目结构是:
src/ ├── com/ │ ├── example/ │ │ ├── Main.java │ │ └── util/ │ │ └── StringUtils.java
在CMakeLists.txt里这么写:
# 递归扫描所有Java源文件(推荐,适合结构固定的项目) file(GLOB_RECURSE PROJECT_SOURCES "src/**/*.java") add_jar(MyCourseProject ${PROJECT_SOURCES} MAIN_CLASS com.example.Main )
或者如果你想精确控制源文件,就把util包的文件也加进去:
add_jar(MyCourseProject src/com/example/Main.java src/com/example/util/StringUtils.java MAIN_CLASS com.example.Main )
这样CMake编译时会把所有相关类都编译,生成的JAR里包含完整的包结构,导入特定类就不会报错了。
2. 正确配置类路径(如果util包是独立模块或已有编译产物)
如果xxx.util是一个单独的CMake目标,或者已经被编译成JAR/Class文件,那你需要在add_jar里通过CLASS_PATH参数把它加入类路径。
比如util包是另一个名为UtilLibrary的CMake JAR目标:
# 先构建util模块 add_jar(UtilLibrary src/com/example/util/StringUtils.java ) # 主项目依赖util模块 add_jar(MyCourseProject src/com/example/Main.java MAIN_CLASS com.example.Main CLASS_PATH $<TARGET_PROPERTY:UtilLibrary,JAR_FILE> )
如果util的Class文件在某个目录下,直接指定目录路径即可:
add_jar(MyCourseProject src/com/example/Main.java MAIN_CLASS com.example.Main CLASS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/util-classes" )
3. 检查包名与目录结构的一致性
Java对包名和目录结构的对应关系要求非常严格,CMake在这方面比Maven更敏感。比如你的类声明是package com.example.util;,那这个类的文件必须放在src/com/example/util/目录下,大小写也要完全匹配(比如Windows下可能不敏感,但Linux/macOS下大小写不匹配会直接报错)。
如果目录结构和包名不对应,哪怕Maven能自动兼容,CMake也会找不到包——这时候通配符导入可能因为IDE的额外类路径支持暂时生效,但根本问题还是目录结构不对,先把这个基础问题解决了,其他配置才会生效。
为什么通配符导入能“解决”问题?
其实这不是真正的解决方法,只是巧合:当你用import xxx.util.*;时,Java编译器会在类路径里尝试查找所有xxx.util下的类,如果你的IDE或者CMake的隐式类路径里刚好有这些类的编译产物,就会暂时生效,但这种方式很不稳定,换个环境可能又会报错,而且不符合Java的编码规范。
内容的提问来源于stack exchange,提问作者inxoy

