龙目岛的Maven范围(编译与提供)

mkr*_*erx 41 java maven lombok

我最近发现lombok.jar最终出现在我们的最终工件中,这不应该是必要的.在我的理解中,lombok只是编译时.

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.14.4</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

但是当我将它设置为提供的范围时,我在单元测试中会遇到奇怪的行为.在尝试解决时,它们会与ClassNotFoundExceptions崩溃

java.lang.NoClassDefFoundError: com/svv/esp/serviceimpl/dataimport/common/validation/LongValidator
Run Code Online (Sandbox Code Playgroud)

哪个maven范围通常用于lombok?

我在MacOSX 10.9上使用Oracle JDK build 1.8.0_25-b17

age*_*nzo 86

应该在provided范围内使用Lombok (参见官方文档).

原因(正如评论中所述)是lombok是一个仅编译时的工具.也就是说,它不会在运行时所需要的一切.通过制作作用域provided,可以使编译器可以使用lombok库,但它不是编译jar的依赖项.因此,您的最终jar将不依赖于Lombok,并且不需要包含在任何部署中,这样可以减少可部署的依赖性和大小.

  • 作为旁注,因为这可能会让很多人感到困惑:maven范围`compile`意味着它在编译时和运行时都可用.如果范围是"提供",则仅在编译时可用.请参见http://stackoverflow.com/questions/6646959 (32认同)
  • 当我使用 lombok [此处](https://asciinema.org/a/VDw2z6tqFsR1aAinR9tQM8QiV) 时,我也对 java 中的“编译”与“提供”感到困惑。感谢您的解释。 (4认同)

Emi*_*uch 5

通常compile.provided适用于通常与将托管应用程序的应用程序服务器一起提供的jar.如果您不想在最终应用程序中使用jar,最好是直接使用maven插件而不是jar:http://awhitford.github.io/lombok.maven/lombok-maven-plugin/index. HTML

  • 这个答案是不正确的。该插件不需要使用,文档中说提供范围 (4认同)

Jin*_*won 5

人们可以与 一起工作compiletrue<optional/>.

\n\n
<scope>compile</scope>\n<optional>true</optional>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅Maven \xe2\x80\x93 可选依赖项和依赖项排除

\n

  • https://projectlombok.org/setup/maven Lombok 官方文档表示使用 `provided` 范围 (6认同)