【问题标题】:How to build a Maven POM file for both Android and Java releases如何为 Android 和 Java 版本构建 Maven POM 文件
【发布时间】:2016-09-16 16:40:31
【问题描述】:

我的要求

我有一个 Java 实用程序库。我想做2个jar文件。一个用于 Android,另一个用于 Java。

对于 Android jar,我想排除 JDBC 包。

我想将 jar 文件和他们的 javadoc、javasources 上传到 Maven 远程存储库。

所以我可以使用下面的库

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>
</dependency>

或 Android 分类器

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>
    <classifier>android</classifier>
</dependency>

这是我的 POM.xml

<project>
    <!-- .... -->

    <groupId>com.mycompany</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>

    <name>mylib</name>
    <packaging>jar</packaging>

    <!-- .... -->

    <build>
        <plugins>
            <!-- compiler -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- .... -->
            </plugin>

            <!-- jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <!-- .... -->
            </plugin>

            <!-- source -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <!-- .... -->
            </plugin>

            <!-- javadoc -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <!-- .... -->
            </plugin>

            <!-- nexus-staging-maven -->
            <plugin>
                <groupId>org.sonatype.plugins</groupId>
                <artifactId>nexus-staging-maven-plugin</artifactId>
                <!-- .... -->
            </plugin>

            <!-- maven-gpg -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-gpg-plugin</artifactId>
                <!-- .... -->
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!-- All files - Java -->
        <profile>
            <id>java</id>
            <activation>
                <property>
                    <name>!android</name>
                </property>
            </activation>
        </profile>

        <!-- Android - Excluding JDBC, JPA packages -->
        <profile>
            <id>android</id>
            <activation>
                <property>
                    <name>android</name>
                </property>
            </activation>
            <build>
                <plugins>

                    <!-- Exclude some packages -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>**/jdbc/**</exclude>
                            </excludes>
                        </configuration>
                    </plugin>

                    <!-- Exclude some packages -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jar-plugin</artifactId>
                        <configuration>
                            <classifier>android</classifier>
                            <excludes>
                                <exclude>**/jdbc/**</exclude>
                            </excludes>
                        </configuration>
                    </plugin>

                    <!-- Exclude some packages --> 
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>**/jdbc/**</exclude>
                            </excludes>
                        </configuration>
                    </plugin>

                    <!-- Exclude some packages -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <configuration>
                            <sourcepath>${project.basedir}/src/main/java</sourcepath>
                            <sourceFileExcludes>
                                <sourceFileExclude>**/jdbc/**</sourceFileExclude>
                            </sourceFileExcludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <dependencies>
        <!-- .... -->
    </dependencies>

</project>

Maven CLI

  1. 运行 mvn clean deploy 以部署 Java 配置文件

    成功。 Maven 将以下文件部署到远程存储库中:

    • mylib-1.0.jar
    • mylib-1.0.pom
    • mylib-1.0-javadoc.jar
    • mylib-1.0-sources.jar
    • 还有他们所有的签名文件
  2. 运行 mvn clean deploy -Dandroid 以部署 Android 配置文件

    生成以下文件:

    • mylib-1.0-android.jar // 附加分类器
    • mylib-1.0.pom
    • mylib-1.0-javadoc.jar
    • mylib-1.0-sources.jar
    • 还有他们所有的签名文件

我出错了

    [ERROR] Repository "mycompany-1082" failures
    [ERROR]   Rule "sources-staging" failures
    [ERROR]     * Missing: no main jar artifact found in folder '/com/mycompany/mylib/1.0'
    [ERROR]   Rule "javadoc-staging" failures
    [ERROR]     * Missing: no main jar artifact found in folder '/com/mycompany/mylib/1.0'

问题:为什么会出现这个错误?

【问题讨论】:

    标签: java maven-3 pom.xml maven-profiles


    【解决方案1】:

    same issue 已被报告,这主要是因为主要工件使用分类器(android 分类器),而源和 javadoc 工件不使用,造成错位。

    确实,错误消息正是指向源和 javadoc 工件的问题:

    [ERROR]   Rule "sources-staging" failures
    [ERROR]     * Missing: no main jar artifact found in folder '/com/mycompany/mylib/1.0'
    [ERROR]   Rule "javadoc-staging" failures
    [ERROR]     * Missing: no main jar artifact found in folder '/com/mycompany/mylib/1.0'
    

    说找不到sourcesjavadoc 工件(根据主要工件分类器):不匹配。

    幸运的是,您可以通过其classifier 选项(默认为sources)和maven-javadoc-plugin 通过其classifier 选项(默认为javadoc)配置maven-source-plugin 来解决此问题。

    android 配置文件实际上可以简单地指定以下 property 条目:

    <properties>
       <maven.source.classifier>android-sources</maven.source.classifier>
       <maven.javadoc.classifier>android-javadoc</maven.javadoc.classifier>
    </properties>
    

    确实将上述插件目标指定的用户属性用于这些选项。

    为了使其更加健壮,最好采用以下方法:

    <properties>
       <android.classifier>android</android.classifier>
       <maven.source.classifier>${android.classifier}-sources</maven.source.classifier>
       <maven.javadoc.classifier>${android.classifier}-javadoc</maven.javadoc.classifier>
    </properties>
    

    然后将${android.classifier} 属性用于maven-jar-pluginclassifier 值:也就是说,集中它的值可以确保更容易维护。

    【讨论】:

    • 谢谢 A_Di-Matteo。下周一我会测试它并告诉你结果。我投了。
    • @Loc 是否使用不同的分类器生成了源代码和 javadoc jar?
    • 是的。生成以下文件:mylib-1.0-android.jar、mylib-1.0-android-javadoc.jar、mylib-1.0-android-sources.jar、mylib-1.0.pom 以及他们所有的签名文件 --- 但没有运气!
    • 查看类似的issue,如果您一次性上传所有内容,将默认工件、源代码、javadoc 和分类工件部署在一起,它实际上应该可以工作,因此您不应该创建分类器作为配置文件的构建,但作为默认构建的一部分,如 here 所述
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 2011-05-09
    • 2020-11-12
    • 2017-02-22
    • 2013-10-02
    • 1970-01-01
    • 2020-05-11
    • 2020-12-28
    相关资源
    最近更新 更多