将外部库.jar添加到Spring引导.jar内部/ lib

时间:2015-05-13 07:03:51

标签: maven spring-boot

我有一个外部.jar,无法使用pom.xml从公共存储库导入,它是sqljdbc41.jar

我可以从我的IDE本地运行项目,一切都会正常工作。下载之后我引用了库:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>sqljdbc41</artifactId>
    <version>4.1</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/sqljdbc41.jar</systemPath>
</dependency>

当我运行mvn clean package来创建我的.jar文件并尝试运行创建的.jar时,会弹出一个错误,提到SQL Server引用无效。然后我提取了我的.jar文件,并且真实地,pom.xml文件中引用的所有内容都被正确下载并添加,但是,我的SQL Server没有。

我可以,以一种非常hacky的方式*只需将sqljdbc41.jar手动添加到我的/ lib文件夹中,然后将其编译为.jar,它就可以工作了,但是看起来似乎非常不理想。什么是更好的方法?

*使用Winrar打开.jar文件,转到/ lib文件夹,手动选择我的sqljdbc41.jar文件,然后确保在左下角选择No Compression选项,Winrar为您提供压缩选项,以防万一通过谷歌找到这个,没有人回答。

7 个答案:

答案 0 :(得分:64)

你可以设置“includeSystemScope”&#39;为真。

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <includeSystemScope>true</includeSystemScope>
  </configuration>
</plugin>

答案 1 :(得分:20)

您可以在本地存储库中安装sqljdbc41.jar:

\

然后将依赖声明为标准依赖:

mvn install:install-file -Dfile=path/to/sqljdbc41.jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc41 -Dversion=4.1 -Dpackaging=jar

如果您使用远程工件存储库(nexus,archiva ...),则还需要在此存储库上部署工件。您可以在此处找到更多信息:{{3}}

答案 2 :(得分:8)

另一种方法,你可以把它放到resources文件夹中,比如resources / lib / xxx.jar,然后像这样配置pom.xml:

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc41</artifactId>
<version>4.1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/sqljdbc41.jar</systemPath>

答案 3 :(得分:3)

就我而言,错误是在标签中提供没有“dot”的版本号:

        <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <scope>system</scope>
        <version>1</version>
        <systemPath>${basedir}/src/main/resources/lib/tools.jar</systemPath>
    </dependency>

这个有效:

        <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <scope>system</scope>
        <version>1.8</version>
        <systemPath>${basedir}/src/main/resources/lib/tools.jar</systemPath>
    </dependency>

答案 4 :(得分:1)

在Spring Boot中:我也面临类似的问题,下面的代码帮助了我。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.7.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
            </configuration>
        </plugin>
    </plugins>
</build>

答案 5 :(得分:0)

它对我有用:

project {root folder}/libs/ojdbc-11.2.0.3.jar

pom.xml:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc</artifactId>
    <version>11.2.0.3</version>
    <scope>system</scope>
    <systemPath>${basedir}/libs/ojdbc-11.2.0.3.jar</systemPath>
</dependency>
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

答案 6 :(得分:0)

Spring-Boot 项目与maven或gradle插件一起使用时,它们默认情况下将应用程序打包为可执行jar。 这些可执行jar不能用作任何其他 Spring-Boot 项目中的依赖项,因为该可执行jar在 BOOT-INF / classes 文件夹中添加类。这意味着当将可执行jar用作依赖项时,找不到它们,因为依赖项jar还将具有如下所示的相同类路径结构。

enter image description here

如果我们要使用project-A作为project-B中的maven依赖项,那么我们必须有两个工件。要生成两个工件,一个可以用作依赖项,另一个可以执行,必须指定分类器。该分类器应用于可执行档案的名称,保留默认档案作为依赖项。 要在Maven中配置exec的分类器,可以使用以下配置:

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

因此,这里的 MAJIC WORD ({MAJIC WORD ))将创建如下所示的jar结构,然后它可以很容易地被spring-boot项目混淆为类路径上的maven依赖jar。 / p>

enter image description here

需要在project-A pom中添加以上插件,该插件将在project-B中用作依赖项。在春天documentation第16.5节中对此进行了解释。也是