переопределение свойства в плагине Maven из командной строки - PullRequest
3 голосов
/ 17 февраля 2020

Эта команда maven запускает более старую версию (1.3.162) базы данных H2:

mvn -debug com.edugility:h2-maven-plugin:1.0:spawn

Как рекомендуется здесь , я пытаюсь переопределить свойство плагина в командной строке .... так что я могу вместо этого использовать более новую версию h2:

mvn -debug -Dh2Version=1.4.200 com.edugility:h2-maven-plugin:1.0:spawn

Это свойство h2Version со старой версией h2 определено здесь, на github в плагине. pom.

Вот конец многословного вывода maven

 [DEBUG] Process arguments: [C:\java\jdk-9.0.4\bin\java, -cp, C:\Users\eoste\.m2\repository\com\h2database\h2\1.3.162\h2-1.3.162.jar, org.h2.tools.Server, -tcp, -tcpPassword, h2-maven-plugin, -tcpPort, 9092]
 [INFO] H2 server spawned at tcp://localhost:9092

Мало того, что старая версия 1.3.162 запускается, но нигде не упоминается свойство h2Version, которое я помещен в командную строку.

Я попытался переместить параметр -Dh2Version в конец командной строки. Я также попытался удалить плагин из локального репозитория, чтобы вызвать загрузку, так что, возможно, h2Version затем будет переоценен ... ни одна из этих вещей не сработала. Этот блог показывает, как встроить зависимость в плагин, но это намного сложнее, чем мой простой вызов командной строки.

Что я делаю не так?

Использование windows 10, java 9, maven 3.6.2

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Что я делаю не так?

1) Остерегайтесь, когда вы хотите использовать плагины / библиотеки без поддержки. Исходный код не обновлялся с 8 лет. Это может иметь важные проблемы.

2) Чтобы узнать, как использовать плагин maven, не смотрите в объявлении pom. Вы можете найти некоторую информацию, но вы найдете гораздо больше информации в реализации / спецификации mojo.
Но на самом деле нет, вам даже не следует полагаться на это, чтобы понять, как использовать плагин.

3) Действительно, плагин Maven может поддерживать настраиваемые свойства: непосредственно в pom. xml и даже экспортировать их для использования в командной строке. Но это не автомат c. Но в обоих случаях это должно быть предусмотрено разработчиком плагина , и это обычно документируется на плагине или на домашней странице репозитория исходного кода.

Фактически в вашем случае, если вы go включите в реализацию Mojo: AbstractH2Mojo , вы сможете увидеть, как задана конфигурация.
Все свойства имеют значения по умолчанию в mojo конструктор.

 protected AbstractH2Mojo() {
    super();
    final Service tcpService = new Service("tcp", Service.getDefaultPort("tcp"), false, false);
    this.setServices(Collections.singletonList(tcpService));
    this.setPort(Service.getDefaultPort("tcp"));
    this.setShutdownPassword("h2-maven-plugin");
    this.setJava(new File(new File(new File(System.getProperty("java.home")), "bin"), "java"));
 }

Сначала вызывается пустой конструктор mojo, затем вызывается весь установщик для созданного экземпляра.
Это означает, что вы можете переопределить любое из этих свойств, определенных в этом классе, во время выполнения, предоставив свойство например, ${artifactIdPrefixWithoutMavenPlugin}.field.
Поскольку подключаемый модуль maven - h2-maven-plugin, префикс для обозначения - h2.

Если вы запустите это:

mvn -X com.edugility:h2-maven-plugin:1.0:spawn -Dh2.port=8084 -Dh2.useSSL=false

Вы можете увидеть в выводе:

[DEBUG] Configuring mojo 'com.edugility:h2-maven-plugin:1.0:spawn' with basic configurator -->
[DEBUG]   (s) port = 8084
[DEBUG]   (s) shutdownHost = localhost
[DEBUG]   (s) shutdownPassword = h2-maven-plugin
[DEBUG]   (s) useSSL = false
[DEBUG] -- end configuration --
[DEBUG] Process arguments: [/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java, -cp, /home/david/.m2/repository/com/h2database/h2/1.3.162/h2-1.3.162.jar, org.h2.tools.Server, -tcp, -tcpPassword, h2-maven-plugin, -tcpPort, 8084]

Относительно используемого банку h2, если вы все еще смотрите в том же классе вы увидите ту часть, которая извлекает файл jar из classpath:

 public final File getH2() {
    final ProtectionDomain pd = Server.class.getProtectionDomain();
    assert pd != null;
    final CodeSource cs = pd.getCodeSource();
    assert cs != null;
    final URL location = cs.getLocation();
    assert location != null;
    try {
      return new File(location.toURI());
    } catch (final URISyntaxException wontHappen) {
      throw (InternalError)new InternalError().initCause(wontHappen);
    }
 }

Это означает, что у вас нет возможности изменить используемый JAR H2: из командной строки при запуске плагина или из объявление плагина в pom. xml, поскольку в Mojo не определено свойство для достижения этого.

если вы измените версию H2, вам нужно изменить версию, встроенную в плагин. Для начала вы можете попытаться раскошелиться на репозиторий плагина GIT, изменить зависимость h2, используемую в pom, в соответствии с вашими требованиями и проверить, возможна ли работа с этим плагином, несмотря на пробел в версии.

Обратите внимание, что вы можете добавить новое свойство Mojo, чтобы сделать его полностью настраиваемым, например:

mvn ... -Dh2Version=1.4.200 

Но в этом случае вам нужно будет получить его. Например, выполнив запрос на загрузку зависимости из центрального репозитория m2, например.
И вам также следует убедиться, что используются только допустимые диапазоны версии h2.

1 голос
/ 17 февраля 2020

Я не думаю, что вы сможете сделать это, используя этот конкретный плагин maven. Вот еще один ответ для кого-то, у кого была похожая проблема: Как передать параметр в плагин Maven из CLI? .

По сути, свойство h2Version не определено как пользовательское свойство.

Когда вы запускаете плагин, используя команду, которую вы упомянули, есть выход для предопределенных свойств конфигурации:

<configuration>
  <allowOthers>${h2.allowOthers}</allowOthers>
  <baseDirectory>${h2.baseDirectory}</baseDirectory>
  <forceShutdown>${h2.forceShutdown}</forceShutdown>
  <ifExists>${h2.ifExists}</ifExists>
  <java>${h2.java}</java>
  <port default-value="9092">${h2.port}</port>
  <shutdownAllServers>${h2.shutdownAllServers}</shutdownAllServers>
  <shutdownHost default-value="localhost">${h2.shutdownHost}</shutdownHost>
  <shutdownPassword default-value="h2-maven-plugin">${h2.shutdownPassword}</shutdownPassword>
  <trace>${h2.trace}</trace>
  <useSSL>${h2.useSSL}</useSSL>
</configuration>

Только эти свойства могут быть определены пользователем , Например, изменение работающего порта:

mvn -debug com.edugility:h2-maven-plugin:1.0:spawn -Dport=9090
...