javax.annotation.Nullable 缺失
在 Hudi 1.0.1 项目中执行以下构建命令时:
mvn clean compile \
-DskipTests \
-Dcheckstyle.skip=true \
-Dhadoop.version=3.3.4
1
2
3
4
2
3
4
你可能会遇到如下错误:
# 🧨 编译失败错误日志
[INFO] ----------------------< org.apache.hudi:hudi-io >-----------------------
[INFO] Building hudi-io 1.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The artifact org.slf4j:slf4j-log4j12:jar:2.0.7 has been relocated to org.slf4j:slf4j-reload4j:jar:2.0.7
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ hudi-io ---
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0-M1:enforce (enforce-maven-version) @ hudi-io ---
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0-M1:enforce (enforce-logging) @ hudi-io ---
[INFO]
[INFO] --- protobuf-maven-plugin:0.6.1:compile (compile-protoc) @ hudi-io ---
[INFO] Compiling 1 proto file(s) to /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/target/generated-sources/protobuf/java
[INFO]
[INFO] --- maven-remote-resources-plugin:1.5:process (process-resource-bundles) @ hudi-io ---
[WARNING] While downloading org.slf4j:slf4j-log4j12:2.0.7
This artifact has been relocated to org.slf4j:slf4j-reload4j:2.0.7.
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ hudi-io ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/resources
[INFO] Copying 1 resource
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ hudi-io ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 54 source files to /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[22,24] cannot find symbol
symbol: class Nullable
location: package javax.annotation
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/io/ByteBufferBackedInputStream.java:[21,24] cannot find symbol
symbol: class Nonnull
location: package javax.annotation
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[152,37] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[156,37] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[169,47] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[169,18] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[173,47] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[181,37] cannot find symbol
symbol: class Nullable
location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/io/ByteBufferBackedInputStream.java:[67,20] cannot find symbol
symbol: class Nonnull
location: class org.apache.hudi.common.util.io.ByteBufferBackedInputStream
[INFO] 9 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.830 s
[INFO] Finished at: 2025-04-22T01:42:42Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project hudi-io: Compilation failure: Compilation failure:
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[22,24] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: package javax.annotation
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/io/ByteBufferBackedInputStream.java:[21,24] cannot find symbol
[ERROR] symbol: class Nonnull
[ERROR] location: package javax.annotation
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[152,37] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[156,37] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[169,47] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[169,18] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[173,47] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/StringUtils.java:[181,37] cannot find symbol
[ERROR] symbol: class Nullable
[ERROR] location: class org.apache.hudi.common.util.StringUtils
[ERROR] /opt/modules/bigtop/dl/hudi-release-1.0.1/hudi-io/src/main/java/org/apache/hudi/common/util/io/ByteBufferBackedInputStream.java:[67,20] cannot find symbol
[ERROR] symbol: class Nonnull
[ERROR] location: class org.apache.hudi.common.util.io.ByteBufferBackedInputStream
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
(base) [root@centos1 hudi-io]#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# 🧨 编译失败错误截图(Cannot find symbol)
报错核心内容
多个 Java 源文件中使用了 @Nullable
和 @Nonnull
注解,但 Maven 构建系统提示:找不到 javax.annotation
中的类定义。这意味着依赖未被正确引入或已被排除。
# 🧩 错误成因详解
这个问题不是 JDK 或 IDE 的锅,而是 依赖冲突+传递排除 的组合问题:
- Hudi 源码中使用了
javax.annotation.Nullable
和javax.annotation.Nonnull
注解(见StringUtils.java
等类); - 在未显式指定 Hadoop 版本的情况下,Hudi 依赖的是 2.x 系列,其 transitively(传递)引入了正确的 annotation-api;
- 但当我们手动使用
-Dhadoop.version=3.3.4
指定了 Hadoop 3.x,Maven 引入了hadoop-common
的新版本 —— 而该版本中:- 明确 排除了
javax.annotation-api
; - 并且未主动引入其他兼容包;
- 明确 排除了
- 最终编译器找不到注解类,抛出
cannot find symbol
。
提示
虽然你使用的是 OpenJDK 8,默认仍支持 javax.annotation.*
,但这部分内容不再被系统默认提供,而是依赖外部包管理。
# 🔧 解决方案:POM 添加显式依赖
修改模块 hudi-io/pom.xml
,添加如下配置:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
<scope>compile</scope>
<optional>false</optional>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
<exclusions>
<exclusion>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
笔记
强制添加 javax.annotation-api
依赖,并对 hadoop-common
传递依赖进行排除,可避免冲突与覆盖。
# 📸 POM 修改位置截图:
# ✅ 重新编译验证
修改后再次运行:
mvn clean compile -DskipTests -Dcheckstyle.skip=true -Dhadoop.version=3.3.4
1
此时构建日志输出如下: