Добавление файла JAR в качестве зависимости к проекту без связанных JAR-файлов - PullRequest
0 голосов
/ 10 января 2019

У нас есть файл payment.jar, разработанный с Spring Framework 3.1.2 . Нам нужно использовать это как зависимость от нового проекта, что его версия Spring Framework 5.x .

Проблема: Когда payment.jar используется в качестве зависимости, транзитивные зависимости payment.jar добавляют к пути к классам проекта, что приводит к конфликту Spring Framework 3 и Spring Framework 5 .

Я попробовал решения:

  1. большая толстая банка :

create-an-исполняемый-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.jarSpring Framework 3.1.2 ) в качестве зависимости от нового проекта с Spring Framework 5.x без проблем, упомянутых выше.

Ответы [ 6 ]

0 голосов
/ 26 января 2019

Идеальным решением было бы обновить все до 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 эту затененную библиотеку со всем выполненным переименованием / перераспределением. Я использовал эту интересную статью , где все детали полностью описаны.

0 голосов
/ 25 января 2019

Лучший вариант для этого - обновить это вручную. Даже если вы сделаете это с помощью Spring 3 jar, при компиляции и запуске вы столкнетесь с множеством проблем.

0 голосов
/ 23 января 2019

Хотя я не делал этого специально с пружиной, общая концепция того, что вы пытаетесь достичь, называется затенением.

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

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

Что вам нужно сделать, это изменить имя пакета как в зависимости, так и в зависимости от jar (в вашем случае spring 3 и jar payment), так что в итоге вы получите две пары зависимостей, которые не перекрываются.

Это относительно просто сделать в maven и аналогичных инструментах. Смотрите ссылку для более подробной информации.

0 голосов
/ 21 января 2019

Ваше желание

Мне нужно использовать payment.jar (с Spring Framework 3.1.2) в качестве зависимость от нового проекта с Spring Framework 5.x без проблем упоминалось выше.

Вы не можете этого сделать. Потому что несоответствие версии зависимостей. Он не имеет обратной совместимости между многими вещами, многими версиями iBatis, Spring Framework, payment.jar и другими зависимостями.

Вы должны обновить его вручную.

0 голосов
/ 21 января 2019

Предлагаю вам конвертировать банку в Spring 5 и MyBatis. Я думаю, что это лучшее решение с точки зрения удобства и совместимости. Я думаю, что переход на 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. Я прикрепляю только интересный.

<?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> 
0 голосов
/ 10 января 2019

Если версии Spring настолько несовместимы, как кажется, вам, вероятно, придется перекомпилировать jar или проект, чтобы они использовали одну и ту же версию Spring.

Если это невозможно (например, если у вас нет источника для фляги), вы можете обернуть банку платежа в микросервисе, чтобы он выполнялся в другом процессе, и поговорить с ним через XML-RPC или мыло.

...