java - 如何为应用程序、源代码和文档生成单独的 jar 文件(针对 central.sonatype.org)

标签 java scala maven jar sbt

Sonatype 有一个存储库,我想将 jar 文件部署到该存储库,他们要求为应用程序、源代码和 javadoc 提供单独的文件:

例子:

example-application-1.4.7.pom
example-application-1.4.7.jar
example-application-1.4.7-sources.jar
example-application-1.4.7-javadoc.jar

在 Scala SBT 中,我有一个名为“package”的命令为项目生成 jar 文件,但它只生成“example-application-1.4.7.jar”。

问题:如何生成另外两个jar文件?

最佳答案

在 Maven 中,为了获得额外的 -sources-javadoc Artifact ,将以下内容添加到您的 POM 文件中:

<build>
    <plugins>
        <!-- additional plugin configurations, if any.. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.10.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意上面的片段:

执行

mvn clean package

您会在 target 文件夹中找到这两个额外的 jar。


.pom 文件是在install 阶段生成的,但它没有放在target 文件夹下。基本上,它是您的 pom.xml 文件的副本,具有不同的扩展名,并且在依赖中介过程中由 Maven 使用,以检查相关 Artifact 需要哪些传递依赖。

执行

mvn clean install

Maven 将在您的本地缓存(在您的机器中)中安装 Artifact ,位于 path_to_cache/.m2/repository/your_groupId/your_artifactId/your_version/ 下。在此文件夹中,您还会找到 .pom 文件,通常您不需要分发该文件(它由 Maven 自动创建)。


进一步注意:您可能不希望在每次构建时都生成这些额外的 jar 文件,因此为了加快正常构建并仅在需要时使用它们,您可以将上面的代码片段包装在 Maven profile 中。 .

您可以通过从 build 部分中删除上面的代码片段并在 pom 的末尾添加一个进一步的部分来实现此目的:

<profiles>
    <profile>
        <id>prepare-distribution</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>3.0.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>2.10.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

这样正常的构建就不会再创建这些 jar 了,但是在执行以下命令时:

mvn clean install -Pprepare-distribution

相反,您会取回它们。 -P 选项实际上是按需激活用 id prepare-distribution 定义的配置文件。


对于 Maven 3,默认配置文件已经作为 super pom 的一部分出现了它们执行完全相同的操作(源代码和 javadoc Artifact ),因此无需向现有项目添加任何内容。只需运行:

mvn clean install -Prelease-profile

或者,通过属性激活它

mvn clean install -DperformRelease=true

但是,正如在 super pom 中也指定的那样,这个配置文件可能会在未来的版本中被删除(尽管从第一个 Maven 3 版本到版本 3.3.9 到目前为止)

NOTE: The release profile will be removed from future versions of the super POM

此警告背后的主要原因很可能是插入使用 Maven Release Plugin ,它通过 useReleaseProfile 间接使用此配置文件release:perform 的选项目标。


正如评论所强调的那样,如果您不熟悉 maven(尤其是通过控制台),我肯定会推荐

  • 通过官方Maven in 5 minutes快速但值得一看的文档。
  • 从命令行使用 Maven,Maven 是否可以为您提供最好的服务。 IDE 集成很棒,但命令行才是真正的转折点。
  • 然后使用上面的 POM 自定义,熟悉一些概念和行为,首先直接作为默认构建的一部分,然后移动到配置文件。
  • 然后,只有这样,移动到 Maven Release Plugin用法。我建议将其作为最后一步,因为您已经获得了更多的信心和理解,并将其视为不那么神奇而更合理的方法。

关于java - 如何为应用程序、源代码和文档生成单独的 jar 文件(针对 central.sonatype.org),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36210913/

相关文章:

java - Scala DynamicVariable 替代 ThreadLocal

java - puppet "require"未按预期工作

使用 MySQL 和 Qtjambi 的 Java 客户端-服务器应用程序 : which licence?

java - Spring 3.0中如何处理比平时花费更多时间的搜索任务

java - 如何正确使用 thymeleaf <a href/>?

scala - 如何将 map 的 RDD 转换为数据框

scala - Spark Dataframes 使用 or 运算符连接 2 列

maven - 如何使用 jacoco 检查多模块 Maven 项目的最小代码覆盖率?

java - 为什么要将 Maven 项目分解为子模块?

java - 如何以最低价格优化购物车?