4
votes

Ajout d'un fichier JAR en tant que dépendance au projet sans ses JAR associés

Nous avons le fichier payment.jar développé avec Spring Framework 3.1.2 . Nous devons l'utiliser comme une dépendance sur un nouveau projet dont sa version est Spring Framework 5.x .

Problème: lorsque payment.jar est utilisé comme dépendance, les dépendances transitives payment.jar s'ajoutent au chemin de classe du projet, ce qui entraîne un conflit Spring Framework 3 et Spring Framework 5 .

J'ai essayé des solutions:

  1. gros pot de graisse :

create-an-executable-jar -avec-dépendances-utilisant-maven

il n'y a pas de succès, le gros JAR, ajoute Spring Framework 3 au projet. (ce que je fais mal!)

  1. à l'exclusion de la dépendance de paiement Spring Framework 3.1.2 dans le nouveau projet :

en raison de l'utilisation de la mise en œuvre de spring-ibatis dans payment.jar , cela ne fonctionne pas. Les nouvelles versions de Spring Framework ne prennent pas en charge ibatis.

Erreur:

Causé par: java.lang.ClassNotFoundException: org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

mon exigence: Je dois utiliser payment.jar (avec Spring Framework 3.1.2 ) en tant que dépendance d'un nouveau projet avec Spring Framework 5.x sans problème mentionné ci-dessus.


5 commentaires

Pouvez-vous mentionner l'erreur exacte que vous obtenez dans divers scénarios? Il semble qu'il y ait deux choses contradictoires A.- ​​Vous voulez supprimer la dépendance du ressort 3 de payment.jar B.- Payment.jar ne fonctionne pas avec le ressort 3 car spring-ibatis ne fonctionne pas avec le ressort 5. A & B semble sois contradictoire avec moi


Pouvez-vous s'il vous plaît publier la classe exacte pour laquelle vous obtenez une exception non trouvée? Ou vous pouvez publier la trace complète de la pile.


@dhroove Je poste la cause racine de l'exception.


vous pouvez essayer d'utiliser mybatis (ibatis evolution) et thi mybatis.org/spring


Je resterais à l'écart de quoi que ce soit comme l'ombrage / l'assemblage des dépendances pour contourner les conflits de version et je voudrais également ressortir 3 pour une nouvelle application car l'application monolithique fonctionne mieux avec une seule version de dépendance et publie l'application. Dans le cadre d'un effort parallèle, j'améliorerai le paiement pour utiliser le printemps 5. C'est la meilleure stratégie en termes de gestion de vos coûts et de votre temps. Vous devez mettre à niveau, peu importe pour conserver la dernière version, pour résoudre toutes les anciennes vulnérabilités de sécurité de la version précédente et cela vous aligne mieux avec d'autres nouvelles fonctionnalités dont vous pourriez avoir besoin dans le nouveau projet.


6 Réponses :


7
votes

Si les versions de Spring sont aussi incompatibles que cela puisse paraître, vous devrez probablement recompiler le fichier jar ou le projet pour qu'ils utilisent la même version de Spring.

Si c'est impossible (par exemple, si vous n'avez pas de source pour le fichier jar), vous pourrez peut-être envelopper le bocal de paiement dans un microservice afin qu'il s'exécute dans un processus différent, et lui parler via XML-RPC ou SOAP.


2 commentaires

merci pour la relecture. J'ai le code source mais en recompilation, la migration est chère et le pot de paiement fait parfaitement son travail il suffit juste de l'utiliser dans un nouveau projet avec spring 5+ sans problème.


Vraisemblablement, un chargeur de classe différent serait suffisant. (Je n'ai pas touché au printemps.)



0
votes

Je vous suggère de convertir votre pot dans Spring 5 et MyBatis. Je pense que c'est la meilleure solution en termes de mantenibility et de compatibilité. Migrer vers iBatis vers MyBatis ne pose pas de gros problème, je pense.

J'avais un projet de travail qui utilise Spring 5 et My-Batis 3. J'ai rencontré un problème pour le configurer, mais au final, j'ai tout résolu. Vérifiez simplement la configuration POM et la configuration Spring.

Configuration POM

Dans les lignes de code suivantes, vous pouvez lire le projet pom (j'ai supprimé une partie inutile du fichier pour votre problème ).

<?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> 

N'oubliez pas de vérifier toujours l'arborescence des dépendances pour éviter d'avoir des fichiers Spring indesidés.

Dépendances tree

Configuration Spring

J'ai un fichier différent pour la configuration Spring. Je joins uniquement l'intéressant.

<?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>

Dans le fichier Spring ci-dessus, vous trouverez:

  • Comment j'ai défini l'emplacement où mettre XML pour les requêtes SQL (commentaire 1)
  • Comment j'utilise la configuration My-batis (commentaire 2)
  • Comment j'ai défini le package d'alias de type (commentaire 3)
  • Comment j'ai défini les interfaces DAO

Enfin, le fichier de configuration My-batis mybatis-config.xml , que j'ai mis dans le même dossier du fichier de configuration Spring:

<?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>


0 commentaires

2
votes

Votre souhait

Je dois utiliser payment.jar (avec Spring Framework 3.1.2) comme dépendance sur un nouveau projet avec Spring Framework 5.x sans problème mentionné ci-dessus.

Vous ne pouvez pas le faire. Parce que la non-correspondance de la version des dépendances. Il n'est pas rétrocompatible entre beaucoup de choses, de nombreuses versions d'iBatis, Spring Framework, payment.jar et d'autres dépendances.

Vous devez le mettre à jour manuellement.


0 commentaires

0
votes

Bien que je ne l'ai pas fait spécifiquement avec le printemps, le concept général de ce que vous essayez d'accomplir est appelé ombrage.

https://softwareengineering.stackexchange.com/questions/297276/what -est-une-dépendance-java-ombrée

La raison pour laquelle le fat jar n'a pas fonctionné est que tous les fichiers jar ont été chargés dans le classpath, et le mauvais sera choisi pour au moins une des dépendances.

Ce que vous devez faire est de changer le nom du package à la fois dans une dépendance et dans le bocal dépendant (dans votre cas, le printemps 3 et le bocal de paiement), de sorte que vous vous retrouvez essentiellement avec deux paires de dépendances qui ne se chevauchent pas.

C'est relativement simple à faire dans maven et des outils similaires. Voir le lien pour plus de détails.


0 commentaires

1
votes

La meilleure option pour cela est de mettre à jour cela manuellement. Même si vous faites cela avec Spring 3 jar, vous allez rencontrer de nombreux problèmes lors de la compilation et de l'exécution.


0 commentaires

1
votes

La solution idéale serait de tout mettre à jour vers Spring 5 ou de déployer payment.jar séparément en tant que microservice comme d'autres l'ont mentionné. Mais ce n'est pas l'essentiel de votre question, peut-être avez-vous des exigences inévitables. Donc, comme @ tomer-shahar l'a dit, la solution est d'utiliser le plugin d'ombrage maven .

Ce genre de conflits se produit souvent lorsque vous utilisez des bibliothèques open source partageant les mêmes bibliothèques mais avec des versions différentes.

Le plugin maven shade permet de renommer / recolocaliser les paquets sélectionnés en évitant les conflits dans les versions. L'inconvénient est que certaines classes seront dupliquées (c'est donc loin d'être idéal). Voir l'exemple ci-dessous:

<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>

Et puis ajoutez comme dépendance au projet Spring 5 cette bibliothèque ombrée avec tout le changement de nom / re-localisation effectué. J'ai utilisé cet article intéressant où tous les détails sont décrits en détail.


0 commentaires