如何在Maven和Eclipse中使用不同的依赖项版本两次构建相同的源代码?

时间:2019-04-24 06:55:44

标签: java eclipse maven m2eclipse

我想构建两个不同版本的自定义SonarQube(SQ)插件;一个用于SonarQube 6.7.x LTS版本,一个用于最新7.6版本。目前,我的Maven结构类似于以下内容:

  • 父母
    • common:工具和两个插件版本都使用的通用代码,不使用SQ API
    • 工具:一些相关的命令行实用工具,不使用SQ API
    • plugin-6.7:SQ 6.7的插件代码
    • plugin-7.6:SQ 7.6的插件代码
    • dist:构建包含CLI实用程序,插件版本,依赖项许可证和源代码的分发zip

plugin-6.7和7.6的大多数源代码和资源都相同;只有少数几类是不同的。因此,我想将此通用代码移至某些共享的源文件夹/模块。

尽管如此,我仍然想对该通用代码进行两次编译,以验证该代码是否针对两个SQ API版本进行了编译。在Eclipse中,这应该显示为两个单独的源文件夹或项目,因此我可以轻松地验证通用代码不使用6.7 API中尚不可用的任何SQ API,也不使用已删除的任何API。或在7.6 API中已弃用。

优选地,我想坚持在单个构建中构建两个插件版本,因此,如果可能的话,我希望避免使用两个单独的配置文件。

这有可能吗?

我尝试过的

使用Maven,我发现了几种方法可以使它工作,但是我无法获得使用m2eclipse的任何这些方法。

方法1

创建一个新的公共插件模块,其中包含pom-6.7.xml和pom-7.6.xml。除了构件ID或分类符之外,两个pom基本上相同,并且依赖于不同的SQ API版本。父项目使用

将它们定义为2个独立的模块
<module>plugin-common/pom-6.7.xml</module>
<module>plugin-common/pom-7.6.xml</module>

这种方法的问题是我无法将这些模块导入Eclipse,因为m2eclipse仅支持pom.xml作为文件名。

方法2

与上述类似,但为pom.xml文件使用了单独的子目录,并使用<sourceDirectory>${project.basedir}/../src/main/java</sourceDirectory>指向了常见的源代码:

  • 常用插件
    • src / main / java
    • src / main / resources
    • pom.xml:6.7和7.6模块的父级
    • 6.7 / pom.xml
    • 7.6 / pom.xml

这种方法允许将两个插件通用版本导入Eclipse,但是Eclipse抱怨“ Access ... / src / main / java目录位于项目基本目录之外”。因此,在两个插件通用项目中,它不会显示任何源代码。

方法3

plugin-common中没有任何pom.xml文件,而是使用{{1}使用build-helper-maven-plugin将通用代码作为源文件夹添加到plugin-6.7和plugin-7.6模块中}。

同样在Eclipse中由于“项目基础目录之外的Access ... / src / main / java目录”警告而失败。

1 个答案:

答案 0 :(得分:1)

我现在选择了以下方法,效果很好。

Maven结构:

  • 父母
    • common:工具和两个插件版本都使用的通用代码,不使用SQ API
    • 工具:一些相关的命令行实用工具,不使用SQ API
    • 插件:SonarQube插件代码
    • dist:构建包含CLI实用程序,插件版本,依赖项许可证和源代码的分发zip

插件模块包含3个基本软件包:

  • myproject.plugin.common:SQ 6.7和7.6实现之间共享的代码
  • myproject.plugin.sq67:特定于SonarQube 6.7-7.5.x的代码
  • myproject.plugin.sq76:SonarQube 7.6+的特定代码

plugin / pom.xml使用SonarQube API依赖项并打包类似于以下内容的插件定义:

        <dependency>
            <groupId>org.sonarsource.sonarqube</groupId>
            <artifactId>sonar-plugin-api</artifactId>
            <version>${sonarqube.version}</version>
            <scope>provided</scope>
        </dependency>
        <plugin>
            <groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
            <artifactId>sonar-packaging-maven-plugin</artifactId>
            <version>1.16</version>
            <extensions>true</extensions>
            <configuration>
                <pluginKey>mykey</pluginKey>
                <pluginClass>myproject.plugin.common.MyPlugin</pluginClass>
                <pluginName>PluginName</pluginName>
                <pluginDescription>Description</pluginDescription>
                <useChildFirstClassLoader>true</useChildFirstClassLoader>
                <sonarQubeMinVersion>6.7</sonarQubeMinVersion>
            </configuration>
        </plugin>

这使该插件可以与SonarQube 6.7+一起使用,即使API依赖版本设置为7.6(请参阅下面的配置文件)。 MyPlugin类是一个泛型类,它使用Java反射来加载特定于6.7或7.6的实现,具体取决于插件所运行的SonarQube版本。

最后,父pom.xml定义了以下两个配置文件:

    <profiles>
        <profile>
            <id>default</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <sonarqube.version>7.6</sonarqube.version>
            </properties>
            <modules>
                <module>common</module>
                <module>plugin</module>
                <module>tool</module>
                <module>dist</module>
            </modules>
        </profile>
        <profile>
            <id>checkSQ6.7Compatibility</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <sonarqube.version>6.7</sonarqube.version>
            </properties>
            <modules>
                <module>common</module>
                <module>plugin</module>
            </modules>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>**/sq76/**</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

现在,默认配置文件将构建与SonarQube 6.7及更高版本兼容的插件,如果在该版本的SonarQube上运行,则启用7.6特定功能。

checkSQ6.7Compatibility配置文件将SonarQube API版本改写为6.7,不包括任何SonarQube 7.6特定的文件夹,并且仅构建common和plugin模块(跳过工具和dist)。这样可以验证6.7通用包和特定于6.7的程序包是否可以使用6.7 API编译正常。

在Eclipse中,我现在使用默认概要文件进行常规开发,从而使我可以同时处理6.7和7.6特定代码。在进行任何重大更改之后,我可以简单地在Eclipse项目配置中选择checkSQ6.7Compatibility配置文件,以确认我没有意外引入对任何7.6特定API的依赖。