2016-04-28 544 views
1

有問題我想使用springboot java框架編譯集成服務器。我正在使用Maven編譯一個jar文件,但我仍然遇到Maven在存儲庫中存儲jar的問題。sapjco3.jar與Maven的命名約定(Springboot)

我正在使用的jar是sapjco3.jar,它會在運行時崩潰(不包),因爲它的名字是sapjco3.jar。由於Maven回購命名約定是:

/%groupId%/%artifactId%/%version%/%artifactId%-%version%.jar 

庫最終被稱爲sapjco3-3.0.jar。

是否有某種方法可以在不使用存儲庫的情況下將我的sapjco3.jar彈出到我的應用程序中(我還沒有能夠將它添加到java.library.path中或通過編輯〜/中的條目和xml。 m2目錄)。否則,是否有腳本重新命名它的方式插入後?順便說一句,我的平臺是ubuntu 14.04 LTS。

我的POM文件(缺少XML頭,因爲StackOverflow上不分析是正確的):

<modelVersion>4.0.0</modelVersion> 

<name>SampleIntegrationServer</name> 
<description>Sample Integration Server</description> 
<groupId>com.Sample</groupId> 
<artifactId>SampleIntegrationServer</artifactId> 
<packaging>jar</packaging> 
<version>0.0.2</version> 

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

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
    <spring-cloud-aws-version>1.0.4.RELEASE</spring-cloud-aws-version> 
</properties> 
<dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-batch</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-integration</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</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-ws</artifactId> 
     </dependency> 
     <dependency> 
     <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-velocity</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-configuration-processor</artifactId> 
      <optional>true</optional> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-aws</artifactId> 
      <version>${spring-cloud-aws-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-aws-messaging</artifactId> 
      <version>${spring-cloud-aws-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>net.sf.jt400</groupId> 
      <artifactId>jt400</artifactId> 
      <version>6.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sap</groupId> 
      <artifactId>sapjco3</artifactId> 
      <version>3.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.microsoft.sqlserver</groupId> 
      <artifactId>sqljdbc4</artifactId> 
      <version>4.2</version> 
     </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <version>1.3.3.RELEASE</version> 
     </plugin> 

     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.6</version> 
      <executions> 
       <execution> 
        <id>copy-resources</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${basedir}/target/classes</outputDirectory> 
         <includeEmptyDirs>true</includeEmptyDirs> 
         <resources> 
          <resource> 
           <directory>${basedir}/src/main/resources</directory> 
           <filtering>false</filtering> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

崩潰:

Factory method 'createSapConnection' threw exception; nested exception is java.lang.ExceptionInInitializerError: JCo initialization failed with java.lang.ExceptionInInitializerError: Illegal JCo archive "sapjco3-3.0.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar". 

我只是想這建立!

感謝

回答

1

我解決了這個問題,自定義佈局

import org.springframework.boot.loader.tools.Layouts.Jar; 

public class ResistantToSapjco3JarLayout extends Jar implements CustomLoaderLayout { 

    @Override 
    public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException { 

    // do Spring Boot defaults 
    writer.writeLoaderClasses(); 

    URL jcoClassUrl = getClass().getClassLoader().getResource("com/sap/conn/jco/JCo.class"); 
    if (jcoClassUrl == null) { 
     throw new IllegalStateException("No sapjco3 JAR on plugin classpath. " 
       + "Make sure sapjco3 is added to spring-boot-maven-plugin dependency section"); 
    } 
    if (!jcoClassUrl.toString().startsWith("jar:file")) { 
     throw new IllegalStateException("sapjco3 is not JAR"); 
    } 
    JarURLConnection jarUrlConnection = (JarURLConnection) jcoClassUrl.openConnection(); 
    JarFile sapjco3Jar = jarUrlConnection.getJarFile(); 

    JarWriter jarWriter = (JarWriter) writer; 
    jarWriter.writeNestedLibrary("BOOT-INF/lib/", 
     new Library("sapjco3.jar", new File(sapjco3Jar.getName()), LibraryScope.COMPILE, false)); 

    } 

} 

的pom.xml

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <layoutFactory implementation="com.company.ResistantToSapjco3JarLayoutFactory" /> 
     <excludeArtifactIds>sapjco3</excludeArtifactIds> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>resistant-to-sapjco3</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>sapjco3</groupId> 
      <artifactId>sapjco3</artifactId> 
      <version>3.0.13</version> 
     </dependency> 
    </dependencies> 
</plugin> 

ResistantToSapjco3JarLayoutFactory

public class ResistantToSapjco3JarLayoutFactory implements LayoutFactory { 

    @Override 
    public Layout getLayout(File source) { 
     return new ResistantToSapjco3JarLayout(); 
    } 
} 
+0

即使線程是很老,我幾乎一樣哈利問這個愚蠢的問題。 sapjco3文件將在哪個目錄中出現...其名稱仍然是sapjco3.jar,對不對? – shartelle

+0

sapjco3文件存儲在可執行JAR歸檔文件內的'BOOT-INF/lib /'文件夾中。文件名不是'still' sapjco3,因爲在Maven倉庫中名稱是'sapjco3-3.0.13',我的解決方案將該文件重命名爲接受'sapjco3' – michaldo