将JAR文件添加为项目的依赖项而没有相关的JAR

时间:2019-01-10 06:15:29

标签: java spring maven maven-plugin executable-jar

我们拥有使用 Spring Framework 3.1.2 开发的文件payment.jar。我们需要使用它作为版本为 Spring Framework 5.x 的新项目的依赖项。

问题:将payment.jar用作依赖项时,payment.jar传递依赖项会添加到项目类路径中,从而导致 Spring Framework 3 Spring Framework发生冲突5

我尝试了解决方法:

  1. 大胖子罐

create-an-executable-jar-with-dependencies-using-maven

没有成功,笨拙的JAR将 Spring Framework 3 添加到项目中。 (我做错了!)

  1. 不包括新项目中的付款Spring Framework 3.1.2依赖项

由于在spring-ibatis中使用payment.jar实现,因此无法使用。 Spring Framework新版本不支持ibatis。

错误:

  

由于:java.lang.ClassNotFoundException:   org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

我的要求: 我需要使用payment.jar(在 Spring Framework 3.1.2 中)作为对 Spring Framework 5.x 的新项目的依赖,而不会出现上述问题。

6 个答案:

答案 0 :(得分:7)

如果听起来像Spring版本一样不兼容,那么您可能不得不重新编译jar或项目,以使它们使用相同版本的Spring。

如果这是不可能的(例如,如果您没有jar的源),则可以将付款jar封装在微服务中,以便它在不同的进程中运行,并通过XML-RPC与之对话或SOAP。

答案 1 :(得分:2)

你的愿望

  

我需要将payment.jar(与Spring Framework 3.1.2一起)用作   使用Spring Framework 5.x完全依赖新项目   上面提到过。

您不能这样做。因为版本的依赖项不匹配。在许多事物,许多版本的iBatis,Spring Framework,payment.jar和其他依赖项之间,它不是向后兼容的。

您必须手动升级。

答案 2 :(得分:1)

最好的选择是手动升级。 即使您将使用Spring 3 jar进行此操作,在编译和运行时也会遇到很多问题。

答案 3 :(得分:1)

理想的解决方案是将所有内容更新到Spring 5或像其他服务一样单独将Payment.jar部署为微服务。但这不是您问题的核心部分,也许您有一些不可避免的要求。因此,正如@ tomer-shahar所说,解决方案是使用maven shade plugin

当您使用共享相同库但版本不同的开源库时,会发生很多此类冲突。

maven shade插件允许重命名/重新定位所选的软件包,以避免版本内的冲突。缺点是某些类将被复制(因此远非理想)。请参见下面的示例:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <finalName>spring321-payment-shaded</finalName>
        <relocations>
          <relocation>
            <pattern>spring.package</pattern>
            <shadedPattern>shaded.spring.package</shadedPattern>
          </relocation>
        </relocations>
        <artifactSet>
          <includes>
            <include>*:*</include>
          </includes>
        </artifactSet>
      </configuration>
    </execution>
  </executions>
</plugin>

然后将该阴影库作为依赖项添加到Spring 5项目中,并完成所有重命名/重分配。我使用了这个有趣的article,其中详细描述了所有细节。

答案 4 :(得分:0)

我建议您在Spring 5和MyBatis中转换jar。我认为在可维护性和兼容性方面,这是更好的解决方案。我认为,将iBatis迁移到MyBatis并不是一个大问题。

我有一个正在使用Spring 5和My-Batis 3的项目。我在配置它时遇到了一些问题,但是最后,我解决了所有问题。只需检查POM配置和Spring配置即可。

POM配置

在下面的代码行中,您可以阅读项目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>it.dummy</groupId>
    <artifactId>dummy</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>Dummy App</name>
    <url>http://maven.apache.org</url>

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

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.skip.tests>true</maven.skip.tests>

        <servlet-api.version>3.1.0</servlet-api.version>
        <spring.version>5.0.7.RELEASE</spring.version>
        <swagger.version>2.9.2</swagger.version>
        <jackson.version>2.9.6</jackson.version>
        <mybatis-spring>1.3.2</mybatis-spring>

        <junit.version>4.12</junit.version>
        <frontend-maven-plugin.version>1.4</frontend-maven-plugin.version>

        <mapstruct.version>1.2.0.Final</mapstruct.version>
    </properties>

    <dependencies>

        <!-- -->
        <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
        <!-- https://github.com/mapstruct/mapstruct -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>

        <!-- cucumber -->
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.14.0</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-java -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-junit -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>


        <!-- test -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet-api.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-rest-core -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-rest-core</artifactId>
            <version>3.0.10.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <!-- Spring Security Artifacts - START -->
        <!-- http://mvnrepository.com/artifact/org.springframework.security/spring-security-web%20 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.springframework.security/spring-security-config%20 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- Spring Security Artifacts - END -->


        <!-- Swagger - BEGIN -->
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>


        <!-- Swagger - END -->

        <!-- json -->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>


        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9</version>
        </dependency>

    </dependencies>

</project>

只需记住始终检查 依赖项树,以免使用Spring jar。

Dependencies tree

Spring配置

对于Spring配置,我有不同的文件。我只附上有趣的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
        <property name="URL" value="jdbc:oracle:thin:@xxx:yyy:zzz" />
        <property name="user" value="aaa"/>
        <property name="password" value="bbb"/>
        <property name="connectionCachingEnabled" value="true" />
    </bean> 


    <bean id="transactionManagerNG" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="sqlSessionFactoryNG" class="org.mybatis.spring.SqlSessionFactoryBean" name="SqlSessionFactoryOrarioStandardDao">
        <property name="dataSource" ref="dataSource" />
        <!-- 1. Where is the xml for query's definitions -->
        <property name="mapperLocations" value="classpath:com/dummy/persistence/dao/*.xml" />

        <!-- 2. My-batis configuration -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>

        <!-- 3. My-batis type alias package -->
        <property name="typeAliasesPackage" value="com.dummy.persistence.model" />
    </bean>

    <!-- 4. needed to parse Java DAO interfaces -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="it.insiel.sanita.farmacieng.persistence.dao" />     
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryNG"/>
    </bean>

    <tx:annotation-driven/> 
</beans>

在上面的Spring文件中,您将找到:

  • 我如何定义将XML用于SQL查询的位置(注释1)
  • 我如何使用My-batis配置(评论2)
  • 我如何定义类型别名包(注释3)
  • 我如何定义DAO接口

最后但并非最不重要的是,我将My-batis配置文件mybatis-config.xml放在Spring配置文件的同一文件夹中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- http://mybatis.org/dtd/ -->
<configuration>

    <settings>
        <setting name="logImpl" value="LOG4J"/>              
        <setting name="cacheEnabled" value="true"/>
        <setting name="defaultStatementTimeout" value="3000"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <setting name="jdbcTypeForNull" value="NULL" />                
    </settings>

</configuration> 

答案 5 :(得分:0)

尽管我还没有专门针对Spring进行此操作,但是您要完成的工作的一般概念称为着色。

https://softwareengineering.stackexchange.com/questions/297276/what-is-a-shaded-java-dependency

胖jar不起作用的原因是因为所有jar都已加载到类路径中,并且至少会为依赖项选择错误的一个。

您需要做的是在依赖项和依赖项(在您的情况下是spring 3和付款项)中都更改软件包名称,因此您基本上得到了两对不重叠的依赖项。

这在Maven和类似工具中相对简单。有关更多详细信息,请参见链接。