maven-source-plugin 构建 sources.jar,但 IDE 无法使用

maven-source-plugin builds sources.jar, but it's unusable by IDEs

我有一个 Maven project 是从生成的源构建的。我使用的是maven-source-plugin,配置如下:

<profiles>
    <profile>
        <id>release</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <id>attach-sources</id>
                            <goals>
                                <goal>jar-no-fork</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                ...

我使用 mvn clean install -P release 构建。这会生成一个包含所有源文件的 ${artifactId}-${version}-sources.jar 文件,但显然它的打包不正确,因为 IDE 无法识别源是否可用。其他一切都能正常构建和工作,包括 Java 文档。

库的主要入口点是 net.mintern.primitive.Primitive。构建项目时,会在 target/generated-sources/net/mintern/primitive/Primitive.java 处生成 Java 文件。然而,在 sources.jar 中,Primitive.java(以及 primitive 目录中的所有其他内容)位于 JAR 的根目录中。 JAR 中没有父目录 (net/mintern/primitive)。

这是否正常,或者这可能是我的问题的原因?我尝试了不同的 includes,改为 jar 而不是 jar-no-fork,显式添加 <attach>true</attach>,使用 build-helper-maven-pluginadd-source,可能更多我忘记了——没有任何影响。 Maven Source Plugin configuration 似乎没有提供任何方式来调整 JAR 中的路径。

你能帮我弄清楚这是怎么回事吗?您可以通过添加此依赖项将项目包含在 POM 中:

<groupId>net.mintern</groupId>
<artifactId>primitive</artifactId>
<version>1.2</version>

可以查看完整的 POM on GitHub,如果您愿意尝试构建它,可以使用 git clone https://github.com/mintern-java/primitive.git 检查有问题的项目,然后 git checkout 1.2

编辑: 我设法使用 maven-jar-plugin 和 build-helper-maven-plugin 的不正当组合解决了这个问题; POM 是 1.2.1 版。不过,我仍然对适当的 maven-source-plugin 修复感兴趣。

除此之外,我的假设是您对 fmpp-maven-plugin 的配置:

<outputDirectory>target/generated-sources/net/mintern/primitive</outputDirector‌​y>

似乎是问题所在。您应该将其更改为:

<outputDirectory>target/generated-sources/</outputDirectory> 

但是你必须在你的freemaker模板中给出一个包。此外,您应该检查 freemarker 插件的文档,看看 outputDirectory 是否没有默认配置为上述值。如果是这样,您可以从您的 pom.xml 中完全删除此条目。 (遵循默认值)。约定优于配置。