Есть ли хранилище maven для быстрого запуска приложения Java 11? - PullRequest
0 голосов
/ 03 ноября 2018

Существует быстрый старт архетипа maven для Java 7, как я вижу здесь: https://maven.apache.org/archetypes/maven-archetype-quickstart/ Проблема с этим, когда я запускаю эту команду:

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart

Войдите в каталог проекта и выполните эту команду:

mvn package

Я получаю эту ошибку:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.20.1:test (default-test) on project gfg-stuff: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.20.1:test failed. NullPointerException

Обратите внимание , что есть какая-то проблема с моей установкой JDK, поскольку update-alternatives говорит мне, что я использую JDK 11:

$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1101      manual mode
  2            /usr/lib/jvm/java-8-oracle/jre/bin/java       1081      manual mode

Но когда я запускаю java -version, это дает мне следующее:

$ java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.3)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.3, mixed mode)

Я не уверен, почему я не получаю OpenJDK 11, несмотря на то, что я установил JDK 11 только в первую очередь. Может быть, начнется другая тема на этом.

1 Ответ

0 голосов
/ 27 мая 2019

ТЛ; др

Архетип quickstart, к сожалению, часто устарел.

Обновите элемент maven-surefire-plugin вашего POM до последней версии, такой как 3.0.0-M3.

Обновите ваши зависимости до текущей версии

Как ни странно, артефакт maven-archetype-quickstart никогда не обновляется . В нем перечислены зависимости от старых версий, которые могут плохо работать с последними версиями Java, вашей IDE или другими библиотеками.

Это довольно неприятно, так как вы думаете, что артефакт будет обновляться с помощью некоторых автоматических сценариев. В конце концов, основная задача Maven - сделать рутинную работу по настройке простой и автоматизированной!

К счастью, вы можете легко обновить номера версий самостоятельно.

Откуда вы знаете, какой номер последней версии вводить для каждой зависимости?

  • Вы можете вручную найти номер последней версии, используя веб-сайт репозитория Maven. Скопируйте и вставьте номер версии в POM.
  • Вы можете разрешить вашей IDE (IntelliJ, NetBeans и т. Д.) Предлагать последний номер при редактировании значения элемента XML номера версии. Вы можете или не можете вводить некоторые «help-me» нажатия клавиш в зависимости от того, как работает ваша IDE. Перед этим обязательно обновите кэш данных хранилища Maven в своей среде IDE, чтобы он знал текущие номера последних версий. Например, в IntelliJ перейдите в настройки и в поле поиска настроек введите repo, а в списке известных репозиториев нажмите каждую кнопку Update.

Steps

Во-первых, если вы используете вашу IDE для работы с Maven, обязательно обновите кэш данных репозитория Maven, чтобы получить последний quickstart артефакт. Например, в IntelliJ кнопка Preferences> Build, Execution, Deployment> Build tools> Maven> Repositories> Update.

enter image description here

image

The initial POM should expand into a bigger one. You may need a Maven clean and install.

After first use, go through your POM.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>work.basil.work.example</groupId>
  <artifactId>quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>quickstart</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Для каждого элемента в POM измените номер версии на последний.

Ваша IDE может помочь, показывая вам список номеров версий, о которых она знает.

enter image description here

Или воспользуйтесь веб-сайтом репозитория Maven для проверки номера последней версии. Как это :

enter image description here

Вы можете обнаружить, что большинство предметов устарели. В частности, в связи с проблемой верной ошибки, описанной в Вопросе, измените элемент верной версии на v3

    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M3</version>
    </plugin>

Это исправит ваш surefire специально, по моему опыту. Некоторые проблемы были недавно исправлены в более поздних версиях. Я не помню характер проблем, возможно, связанных с Java Platform Module System .

Моя версия POM после обновления до последней на 2019-05-29.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>work.basil.work.example</groupId>
  <artifactId>quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>quickstart</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>5.5.0-M1</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.0.0-M3</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.1.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>3.0.0-M1</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>3.0.0-M1</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

JUnit

Обратите внимание, я также обновил JUnit с v4 до значительно улучшенного v5 "Юпитер". Если вы сделаете это, вам также потребуется обновить файл AppTest.java, чтобы просто изменить строки import.

Старый:

package work.basil.work.example;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }
}

Новое:

package work.basil.work.example;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        assertTrue( true );
    }
}

Наконец, сделайте Maven clean и install, чтобы получить последние версии ваших зависимостей, фактически установленных внутри вашего приложения.

Кстати, для получения дополнительной информации о JUnit Jupiter и о том, как запустить старые тесты JUnit 3 и 4, см. мой ответ на другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...