Java编译器不允许在使用JPMS的项目中使用“compileOnly”模块中具有“Source”保留的注释

Java编译器不允许在使用JPMS的项目中使用“compileOnly”模块中具有“Source”保留的注释,java,annotations,java-9,Java,Annotations,Java 9,注释处理器和编译器插件通常使用源代码或类保留来定义注释。这些注释不会在运行时公开,因此不需要在运行时类路径中包含它们;它们可以通过编译在Gradle构建文件中使用。此外,不需要在模块信息文件中声明它们的用途。然而,在存在模块信息文件的情况下,Java编译器要求注释类包含在运行时类路径中——它们必须在模块信息中声明,这意味着它们必须通过实现而不是编译从Gradle访问。这似乎是编译器对JPMS支持的一个漏洞。或者,对于这种奇怪的行为有什么好的解释吗 这里有一个例子 包com.example; ..

注释处理器和编译器插件通常使用源代码或类保留来定义注释。这些注释不会在运行时公开,因此不需要在运行时类路径中包含它们;它们可以通过编译在Gradle构建文件中使用。此外,不需要在模块信息文件中声明它们的用途。然而,在存在模块信息文件的情况下,Java编译器要求注释类包含在运行时类路径中——它们必须在模块信息中声明,这意味着它们必须通过实现而不是编译从Gradle访问。这似乎是编译器对JPMS支持的一个漏洞。或者,对于这种奇怪的行为有什么好的解释吗

这里有一个例子

包com.example; ... @RetentionRetentionPolicy.SOURCE public@interface示例{ ... } com.example.example注释在dependency my annotation过程中定义

在Foo.java中使用ExampleAnnotation

包装abc; 公开课Foo{ @com.example.example 公之于众{ ... } } module-info.java文件不需要使用注释

模块MyProject{ //应该没有这个必要。 //另外,添加它需要Gradle中的“实现”依赖项,这会将它带入不属于它的运行时。 //需要my.annotation.proc; } 编译项目会产生一个编译错误,指示com.example不可见等。

requires指令对于任何依赖项都是必需的,而不仅仅是运行时依赖项

与之相比:

7.7.1. 依赖 requires指令指定当前模块依赖的模块的名称

requires关键字后面可能跟有static修饰符。这指定依赖性在编译时是必需的,但在运行时是可选的

我不知道使用是否需要静态my.annotation.proc;解决了Gradle的问题,但这就是在语言级别处理它的方式。

对于任何依赖项,而不仅仅是运行时依赖项,requires指令都是必需的

与之相比:

7.7.1. 依赖 requires指令指定当前模块依赖的模块的名称

requires关键字后面可能跟有static修饰符。这指定依赖性在编译时是必需的,但在运行时是可选的


我不知道使用是否需要静态my.annotation.proc;解决了Gradle的问题,但这就是语言级别应该如何处理的。

相关Q&A:| |相关Q&A:| | |它应该解决Gradle的问题。显示编译对应于要求静态。啊,我的不好。换句话说,RTFM;感谢您的快速反馈!它应该可以解决Gradle的问题。显示编译对应于要求静态。啊,我的不好。换句话说,RTFM;感谢您的快速反馈!
dependencies {
    compileOnly 'com.example:my-annotation-proc:0.1-SNAPSHOT'
    annotationProcessor 'com.example:my-annotation-proc:0.1-SNAPSHOT'
}