Maven exec 插件不能依赖提供的依赖项?

问题描述 投票:0回答:4

在我的 POM 中我有这个依赖项

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>0.10.0-RC1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

现在我尝试在 Maven exec 插件中使用它,如下所示:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2</version>
            <executions>
                <execution>
                    <id>delombok-source</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <executable>java</executable>
                <arguments>
                    <argument>-classpath</argument>
                    <classpath>
                        <dependency>org.projectlombok:lombok</dependency>
                    </classpath>
                    <argument>lombok.core.Main</argument>
                    <argument>delombok</argument>
                    <argument>src/main/java</argument>
                    <argument>-d</argument>
                    <argument>target/src-delomboked</argument>
                </arguments>
            </configuration>
        </plugin>

但是每次我执行

exec:exec
时,都会收到“java.lang.NoClassDefFoundError:lombok/core/Main”错误。一些测试表明这是因为依赖关系是在提供的范围内声明的

为什么 exec 插件不能使用提供的依赖项?其次,有什么方法可以让 exec 插件在不更改依赖范围的情况下使用该依赖项?

java maven
4个回答
9
投票

稍后找到答案:只需将其添加到您的配置中

<classpathScope>compile</classpathScope>

事后看来,这是有道理的,因为 lombok 是一个编译时注释处理器,而不是运行时依赖项。


4
投票

如果有人想知道如何在不修改 pom 的情况下执行此操作,您可以在命令中添加以下选项:

-Dexec.classpathScope="compile"

例如,我正在使用:

mvn compile exec:java -Dexec.mainClass="my.package.MyMainClass" -Dexec.classpathScope="compile"

1
投票

您可能对 lombok-maven-plugin 感兴趣,而不是尝试使用 exec-maven-plugin。


0
投票

我对插件做出了更改,尽管花了一段时间(8 年)才合并和发布。现在支持:

<classpathScope>compile</classpathScope>

相关公关在这里.

这比使依赖项“编译”范围更好,因为您的应用程序不会在其生产类路径上有不必要的依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.