0

我有一个在 STS 中开发的 Spring Boot 应用程序,它通过 SAP Java 连接器连接到 SAP。该连接器位于一个 jar 中,其规则禁止重命名或重新打包存档。

由于应用程序必须在多个平台上运行,我在本地将 SAP JCO jar 重新打包到一组自定义依赖项中,如下所示:

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并且特定于平台的文件被复制到一个子目录中,该子目录通过MANIFEST Class-Path条目对最终 jar 可见。

这是 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)中,当我通过右键单击 ->Run As ->Spring Boot App 运行应用程序时,该项目似乎以默认方式打包 - 因此打包了 SAP jar - 并且执行中断:

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

我想我必须以某种方式在 IDE 中复制 Maven 配置,但我找不到这样做的方法。在“运行配置”中似乎没有办法做到这一点,该菜单命令似乎也没有运行 Spring Boot Maven 插件spring-boot:run目标,我可以在 POM 中进行配置。

这阻碍了我从 IDE 内部调试应用程序,而且我还被迫手动打包并从命令行运行它,从而减慢了开发速度。

我能做些什么?

4

0 回答 0