Как создать один и тот же исходный код дважды с разными версиями зависимостей, как в Maven, так и в Eclipse? - PullRequest
4 голосов
/ 24 апреля 2019

Я хотел бы построить две разные версии пользовательского плагина 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: Создает zip-дистрибутив, содержащий утилиту CLI, версии плагинов, лицензии на зависимости и исходный код

Большая часть исходного кода и ресурсов одинаковы для обоих плагинов-6.7 и 7.6; только небольшое количество классов отличается. Как таковой, я хотел бы переместить этот общий код в какую-то общую исходную папку / модуль

Я все же хотел бы скомпилировать этот общий код дважды, чтобы проверить, компилируется ли код для обеих версий SQ API. В Eclipse это должно отображаться в виде двух отдельных исходных папок или проектов, поэтому я могу легко проверить, что общий код не использует API SQ, которые еще не доступны в API 6.7, и не использует API, которые были удалены или устарел в 7.6 API.

Предпочтительно, я бы хотел придерживаться сборки обеих версий плагинов в одной сборке, поэтому, если возможно, я бы хотел избежать использования двух отдельных профилей.

Возможно ли это как-нибудь?

Что я пробовал

С Maven я нашел несколько способов заставить это работать, но я не могу заставить ни один из этих подходов работать с m2eclipse.

Подход 1

Создайте новый общий модуль plugin, содержащий pom-6.7.xml и pom-7.6.xml. Оба 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 / основные / ресурсы
  • pom.xml: родительский модуль для модулей 6,7 и 7,6
  • 6,7 / pom.xml
  • 7,6 / pom.xml

Этот подход позволяет импортировать обе общие версии плагинов в Eclipse, но Eclipse жалуется на «Access ... / src / main / java каталог вне базового каталога проекта». Как таковой, он не показывает никакого исходного кода в двух общих проектах плагинов.

Подход 3

Не добавляйте файлы pom.xml в plugin-common, но вместо этого добавьте общий код в качестве исходных папок в модули plugin-6.7 и plugin-7.6, используя build-helper-maven-plugin, используя <source>${project.basedir}/../plugin-common/src/main/java</source>.

Снова это происходит в Eclipse из-за предупреждения «Access ... / src / main / java каталог вне базового каталога проекта».

1 Ответ

1 голос
/ 25 апреля 2019

Я выбрал следующий подход, который работает довольно хорошо.

Maven структура:

  • родитель
    • common: общий код, используемый как инструментом, так и обеими версиями плагинов, не использует SQ API
    • : некоторые связанные утилиты командной строки, не использующие SQ API
    • плагин: код плагина SonarQube
    • dist: Создает zip-дистрибутив, содержащий утилиту CLI, версии плагинов, лицензии на зависимости и исходный код

Модуль плагина содержит 3 базовых пакета:

  • myproject.plugin.common: Код, общий для реализации SQ 6.7 и 7.6
  • myproject.plugin.sq67: код, специфичный для SonarQube 6.7 - 7.5.x
  • myproject.plugin.sq76: код, специфичный для SonarQube 7.6 +

Плагин / 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 и выше, с включенными функциями 7.6, если он работает в этой версии SonarQube.

Профиль checkSQ6.7Compatibility переопределяет версию API SonarQube до 6.7, исключает любые папки, специфичные для SonarQube 7.6, и создает только общие и подключаемые модули (инструмент пропуска и dist). Это позволяет проверить, что общие и специфичные для 6.7 пакеты компилируются нормально с API 6.7.

В Eclipse я теперь использую профиль по умолчанию для обычной разработки, что позволяет мне одновременно работать с конкретными кодами 6.7 и 7.6. После любых существенных изменений я могу просто выбрать профиль checkSQ6.7Compatibility в конфигурации проекта Eclipse, чтобы убедиться, что я случайно не ввел зависимость от каких-либо специфичных для 7.6 API.

...