Maven mvn spring-boot: run - не может найти локальную библиотеку, происходит сбой в командной строке, но выполняется в STS4 - PullRequest
0 голосов
/ 01 ноября 2019

мое приложение Spring Boot (v2.2.0.RELEASE) называется project-service. Я хочу заключить его в контейнер и в процессе заметить, что он не работает вне Eclipse (STS4). Поэтому мне интересно, что мне следует изменить.

Приложение использует небольшую библиотеку, которую я написал, для повторного использования некоторых классов (fscl-core-lib), которая построена через Maven в качестве jar-файла и на данный момент покоится на моем локальноммашина.

 path-to-project/fscl-core-lib/target/fscl-core-lib-0.2.0.jar

Когда я запускаю приложение из Eclipse (на самом деле STS4), оно работает. Когда я пытаюсь запустить из командной строки, это дает сбой по-разному, независимо от того, что я пытаюсь, все из-за того, что не найти библиотеку.

Я пробовал до сих пор:

1) Зависимость Maven от lib

в project-service / pom.xml:

    <dependency>
        <groupId>io.fscl</groupId>
        <artifactId>fscl-core-lib</artifactId>
        <version>0.2.0</version>            
    </dependency>

это выполняется в STS4, но не работает на CLI с:

[ERROR] Failed to execute goal on project project-service: Could not resolve dependencies for project io.fscl:project-service:jar:0.2.0: Failure to find io.fscl:fscl-core-lib:jar:0.2.0 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]

2) Скажите Maven, где найти библиотеку jar

<repositories>
    <repository>
    <id>fscl-core-lib</id>
    <url>file://path-to-project/fscl-core-lib/target</url>
  </repository>
</repositories>
...
<dependency>
    <groupId>io.fscl</groupId>
    <artifactId>fscl-core-lib</artifactId>
    <version>0.2.0</version>            
</dependency>

Thisработает в STS4, но не работает в CLI с:

[ERROR] Failed to execute goal on project project-service: Could not resolve dependencies for project io.fscl:project-service:jar:0.2.0: Failure to find io.fscl:fscl-core-lib:jar:0.2.0 in file:///path-to-project/fscl-core-lib/target was cached in the local repository, resolution will not be reattempted until the update interval of fscl-core-lib has elapsed or updates are forced -> [Help 1]

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

3) В качестве последнего средства включите jar в путь к классу

В STS4 для службы проекта Project -> Properties -> Java Build Path --> Библиотеки -> Добавить внешние JAR-файлы ..., затем выбрать path-to-project/fscl-core-lib/target/fscl-core-lib-0.2.0.jar

Это выполняется в STS4, но завершается неудачно с ошибками компилятора в CLI, поскольку ничего не находит в пакетах libs.

java.lang.NoClassDefFoundError: fscl/core/FSCLEntity
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_131]

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

Любые советы приветствуются.

Для справки, вот pom.xml библиотеки:

fscl-core-lib / pom.xml

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.fscl</groupId>
<artifactId>fscl-core-lib</artifactId>
<version>0.2.0</version>
<name>fscl-core-lib</name>
<description>Library with cross-service reusable classes for FSCL system.</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

</dependencies>

Ипроект приложения-службы / pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.fscl</groupId>
<artifactId>project-service</artifactId>
<version>0.2.0</version>
<name>project-service</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<repositories>
    <repository>
    <id>fscl-core-lib</id>
    <url>file://path-to-project/fscl-core-lib/target</url>
  </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>io.fscl</groupId>
        <artifactId>fscl-core-lib</artifactId>
        <version>0.2.0</version>            
    </dependency>

    <dependency>
        <groupId>de.bechte.junit</groupId>
        <artifactId>junit-hierarchicalcontextrunner</artifactId>
        <version>4.12.1</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.4</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons-core</artifactId>
        <version>1.4.1.RELEASE</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

1 Ответ

0 голосов
/ 11 ноября 2019

Итак,

, как советовал LucasP, запуск mvn install в проекте lib делает свое дело, так как он устанавливает jar в локальный репозиторий (~ / .m2 ...).

Тем временем я вместо этого решил создать отдельный репозиторий в в зависимости от проектов и развернуть в него lib jar ( см. Эту статью ).

Таким образом, как только мне нужно собрать новую версию библиотеки, (1) я обновляю информацию о ее версии в pom.xml, (2) собираю ее с mvn package, (3) запускаюmvn deploy:deploy-file команда для каждого зависимого проекта (я поддерживаю их в deploy bash-скрипте в папке lib).

...