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:
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!)
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.
6 Réponses :
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.
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.)
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.
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.
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:
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>
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.
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. p>
C'est relativement simple à faire dans maven et des outils similaires. Voir le lien pour plus de détails.
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.
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.
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.