Как настроить приложение Spring Boot, запускаемое внутри Eclipse STS - PullRequest
0 голосов
/ 23 января 2019

У меня есть приложение Spring Boot, разработанное в STS, которое подключается к SAP через SAP Java-коннектор.Этот соединитель поставляется в банке, правила которой запрещают переименовывать или переупаковывать архив.

Поскольку приложение должно работать на нескольких платформах, я локально переупаковал баночки JCO SAP в пользовательский набор зависимостей, имеющих такую ​​форму:

connectors-project
|   pom.xml
|       
+---sap-jco-api
|       pom.xml
|       sapjco3.jar
|
+---sap-jco-linux-x86_64
|   |   pom.xml
|   |       
|   \---src
|       \---main
|           \---resources
|                   libsapjco3.so
|                   Readme.txt
|                   sapjco3.jar
|                   sapjcomanifest.mf
|               
\---sap-jco-nt-amd64
    |   pom.xml
    |       
    \---src
        \---main
            \---resources
                    Readme.txt
                    sapjco3.dll
                    sapjco3.jar
                    sapjco3.pdb
                    sapjcomanifest.mf

Модуль sap-jco-api используется для компиляции, остальные для выполнения.Правильная упаковка обрабатывается отдельно для каждого проекта, каждый раз конфигурируя плагин maven-dependency-plugin.

Для рассматриваемого приложения Spring Boot вот соответствующая часть 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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <packaging>...</packaging>
    <version>...</version>

    <name>...</name>
    <description>...</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
    </parent>

  <properties />

    <build>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Class-Path>sap-jco/sapjco3.jar</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>...</mainClass>
                    <excludeGroupIds>com.sap</excludeGroupIds>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                  <execution>
                    <id>unpack-dependencies-package</id>
                    <phase>package</phase>
                    <goals>
                      <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeTransitive>true</excludeTransitive>
                        <includeGroupIds>com.sap</includeGroupIds>
                        <excludeArtifactIds>sap-jco-api</excludeArtifactIds>
                        <excludes>META-INF/**</excludes>
                      <outputDirectory>${project.build.directory}/sap-jco</outputDirectory>
                    </configuration>
                  </execution>
                </executions>
            </plugin>

        </plugins>

    </build>

    <dependencies>

        <!-- Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>...</artifactId>
        </dependency>

        <!-- SAP JCO connector -->
        <dependency>
            <groupId>com.sap</groupId>
            <artifactId>sap-jco-api</artifactId>
            <version>3.0.18</version> 
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.sap</groupId>
            <artifactId>sap-jco-nt-amd64</artifactId>
            <version>3.0.18</version>
            <scope>provided</scope>
        </dependency>

        <!--  other -->
        <dependency>...</dependency>

    </dependencies>

</project>

В время пакета все зависимости SAP исключаются из файла JAR, созданного spring-boot-maven-plugin, а файлы, относящиеся к платформе, копируются в подкаталог, который становится видимым для окончательного файла JAR с помощью записи MANIFEST Class-Path.

Это папка назначения, созданная Maven для этого POM:

application-project
|   
\---target
    |   application.jar
    |   
    \---sap-jco
            Readme.txt
            sapjco3.dll
            sapjco3.jar
            sapjco3.pdb
            sapjcomanifest.mf

Полученный файл Jar работает, как и ожидалось, при запуске с java -jar target\application.jar.

Проблема возникаетв STS (или Eclipse), когда я запускаю приложение с правой кнопкой мыши -> Запуск от имени -> Spring Boot App, проект, по-видимому, упакован по умолчанию - таким образом, с упакованным jar-файлом SAP- и выполнение прерывается с помощью:

JCo initialization failed with java.lang.ExceptionInInitializerError: Illegal JCo archive [...]. It is not allowed to rename or repackage the original archive "sapjco3.jar".

Я думаю, мне нужно каким-то образом реплицировать конфигурацию Maven в IDE, но я не могу найти способ сделать это.В «Запуске конфигураций», похоже, нет способа сделать это, и при этом эта команда меню не запускает цель Spring Boot Maven Plugin spring-boot:run, которую я мог настроить внутри POM.

Это мешает мне отлаживать приложение из среды IDE, и я также вынужден вручную упаковать и запустить его из командной строки, что замедляет разработку.

Что я могу сделать?

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