use DsStrUtils

This commit is contained in:
huayanYu 2023-10-23 21:29:36 +08:00
parent 7994897b25
commit d54f06fa98
14 changed files with 46 additions and 47 deletions

View File

@ -22,6 +22,10 @@ package com.baomidou.dynamic.datasource.toolkit;
*/ */
public abstract class DsStrUtils { public abstract class DsStrUtils {
public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
/** /**
* 判断字符串是否为空 * 判断字符串是否为空
* *

View File

@ -16,7 +16,7 @@
<properties> <properties>
<java.version>17</java.version> <java.version>17</java.version>
<spring-boot-dependencies.version>3.1.3</spring-boot-dependencies.version> <spring-boot-dependencies.version>3.1.5</spring-boot-dependencies.version>
</properties> </properties>
<dependencies> <dependencies>
@ -66,6 +66,7 @@
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-dependencies.version}</version>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.graalvm.buildtools</groupId> <groupId>org.graalvm.buildtools</groupId>

View File

@ -24,6 +24,7 @@ import com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.strategy.DynamicDataSourceStrategy; import com.baomidou.dynamic.datasource.strategy.DynamicDataSourceStrategy;
import com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy; import com.baomidou.dynamic.datasource.strategy.LoadBalanceDynamicDataSourceStrategy;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.p6spy.engine.spy.P6DataSource; import com.p6spy.engine.spy.P6DataSource;
import io.seata.rm.datasource.DataSourceProxy; import io.seata.rm.datasource.DataSourceProxy;
@ -32,7 +33,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -128,7 +128,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource implemen
* @return 数据源 * @return 数据源
*/ */
public DataSource getDataSource(String ds) { public DataSource getDataSource(String ds) {
if (StringUtils.isEmpty(ds)) { if (DsStrUtils.isEmpty(ds)) {
return determinePrimaryDataSource(); return determinePrimaryDataSource();
} else if (!groupDataSources.isEmpty() && groupDataSources.containsKey(ds)) { } else if (!groupDataSources.isEmpty() && groupDataSources.containsKey(ds)) {
log.debug("dynamic-datasource switch to the datasource named [{}]", ds); log.debug("dynamic-datasource switch to the datasource named [{}]", ds);
@ -188,7 +188,7 @@ public class DynamicRoutingDataSource extends AbstractRoutingDataSource implemen
* @param ds 数据源名称 * @param ds 数据源名称
*/ */
public synchronized void removeDataSource(String ds) { public synchronized void removeDataSource(String ds) {
if (!StringUtils.hasText(ds)) { if (!DsStrUtils.hasText(ds)) {
throw new RuntimeException("remove parameter could not be empty"); throw new RuntimeException("remove parameter could not be empty");
} }
if (primary.equals(ds)) { if (primary.equals(ds)) {

View File

@ -20,12 +20,12 @@ import com.baomidou.dynamic.datasource.enums.SeataMode;
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent; import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
import com.baomidou.dynamic.datasource.support.ScriptRunner; import com.baomidou.dynamic.datasource.support.ScriptRunner;
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils; import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import com.p6spy.engine.spy.P6DataSource; import com.p6spy.engine.spy.P6DataSource;
import io.seata.rm.datasource.DataSourceProxy; import io.seata.rm.datasource.DataSourceProxy;
import io.seata.rm.datasource.xa.DataSourceProxyXA; import io.seata.rm.datasource.xa.DataSourceProxyXA;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.List; import java.util.List;
@ -84,7 +84,7 @@ public class DefaultDataSourceCreator {
throw new IllegalStateException("creator must not be null,please check the DataSourceCreator"); throw new IllegalStateException("creator must not be null,please check the DataSourceCreator");
} }
String propertyPublicKey = dataSourceProperty.getPublicKey(); String propertyPublicKey = dataSourceProperty.getPublicKey();
if (StringUtils.isEmpty(propertyPublicKey)) { if (DsStrUtils.isEmpty(propertyPublicKey)) {
dataSourceProperty.setPublicKey(publicKey); dataSourceProperty.setPublicKey(publicKey);
} }
Boolean propertyLazy = dataSourceProperty.getLazy(); Boolean propertyLazy = dataSourceProperty.getLazy();
@ -112,12 +112,12 @@ public class DefaultDataSourceCreator {
DatasourceInitProperties initProperty = dataSourceProperty.getInit(); DatasourceInitProperties initProperty = dataSourceProperty.getInit();
String schema = initProperty.getSchema(); String schema = initProperty.getSchema();
String data = initProperty.getData(); String data = initProperty.getData();
if (StringUtils.hasText(schema) || StringUtils.hasText(data)) { if (DsStrUtils.hasText(schema) || DsStrUtils.hasText(data)) {
ScriptRunner scriptRunner = new ScriptRunner(initProperty.isContinueOnError(), initProperty.getSeparator()); ScriptRunner scriptRunner = new ScriptRunner(initProperty.isContinueOnError(), initProperty.getSeparator());
if (StringUtils.hasText(schema)) { if (DsStrUtils.hasText(schema)) {
scriptRunner.runScript(dataSource, schema); scriptRunner.runScript(dataSource, schema);
} }
if (StringUtils.hasText(data)) { if (DsStrUtils.hasText(data)) {
scriptRunner.runScript(dataSource, data); scriptRunner.runScript(dataSource, data);
} }
} }

View File

@ -15,11 +15,11 @@
*/ */
package com.baomidou.dynamic.datasource.ds; package com.baomidou.dynamic.datasource.ds;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.dynamic.datasource.tx.ConnectionFactory; import com.baomidou.dynamic.datasource.tx.ConnectionFactory;
import com.baomidou.dynamic.datasource.tx.ConnectionProxy; import com.baomidou.dynamic.datasource.tx.ConnectionProxy;
import com.baomidou.dynamic.datasource.tx.TransactionContext; import com.baomidou.dynamic.datasource.tx.TransactionContext;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
@ -50,11 +50,11 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource {
@Override @Override
public Connection getConnection() throws SQLException { public Connection getConnection() throws SQLException {
String xid = TransactionContext.getXID(); String xid = TransactionContext.getXID();
if (StringUtils.isEmpty(xid)) { if (DsStrUtils.isEmpty(xid)) {
return determineDataSource().getConnection(); return determineDataSource().getConnection();
} else { } else {
String ds = DynamicDataSourceContextHolder.peek(); String ds = DynamicDataSourceContextHolder.peek();
ds = StringUtils.isEmpty(ds) ? getPrimary() : ds; ds = DsStrUtils.isEmpty(ds) ? getPrimary() : ds;
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds); ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection()) : connection; return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection()) : connection;
} }
@ -63,11 +63,11 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource {
@Override @Override
public Connection getConnection(String username, String password) throws SQLException { public Connection getConnection(String username, String password) throws SQLException {
String xid = TransactionContext.getXID(); String xid = TransactionContext.getXID();
if (StringUtils.isEmpty(xid)) { if (DsStrUtils.isEmpty(xid)) {
return determineDataSource().getConnection(username, password); return determineDataSource().getConnection(username, password);
} else { } else {
String ds = DynamicDataSourceContextHolder.peek(); String ds = DynamicDataSourceContextHolder.peek();
ds = StringUtils.isEmpty(ds) ? getPrimary() : ds; ds = DsStrUtils.isEmpty(ds) ? getPrimary() : ds;
ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds); ConnectionProxy connection = ConnectionFactory.getConnection(xid, ds);
return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection(username, password)) return connection == null ? getConnectionProxy(xid, ds, determineDataSource().getConnection(username, password))
: connection; : connection;

View File

@ -17,8 +17,8 @@ package com.baomidou.dynamic.datasource.event;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty; import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils; import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -40,7 +40,7 @@ public class EncDataSourceInitEvent implements DataSourceInitEvent {
@Override @Override
public void beforeCreate(DataSourceProperty dataSourceProperty) { public void beforeCreate(DataSourceProperty dataSourceProperty) {
String publicKey = dataSourceProperty.getPublicKey(); String publicKey = dataSourceProperty.getPublicKey();
if (StringUtils.hasText(publicKey)) { if (DsStrUtils.hasText(publicKey)) {
dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl())); dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl()));
dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername())); dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername()));
dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword())); dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword()));
@ -56,7 +56,7 @@ public class EncDataSourceInitEvent implements DataSourceInitEvent {
* 字符串解密 * 字符串解密
*/ */
private String decrypt(String publicKey, String cipherText) { private String decrypt(String publicKey, String cipherText) {
if (StringUtils.hasText(cipherText)) { if (DsStrUtils.hasText(cipherText)) {
Matcher matcher = ENC_PATTERN.matcher(cipherText); Matcher matcher = ENC_PATTERN.matcher(cipherText);
if (matcher.find()) { if (matcher.find()) {
try { try {

View File

@ -17,8 +17,8 @@ package com.baomidou.dynamic.datasource.provider;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty; import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection; import java.sql.Connection;
@ -106,7 +106,7 @@ public abstract class AbstractJdbcDataSourceProvider extends AbstractDataSourceP
try { try {
// 由于 SPI 的支持现在已无需显示加载驱动了 // 由于 SPI 的支持现在已无需显示加载驱动了
// 但在用户显示配置的情况下进行主动加载 // 但在用户显示配置的情况下进行主动加载
if (!StringUtils.isEmpty(driverClassName)) { if (!DsStrUtils.isEmpty(driverClassName)) {
Class.forName(driverClassName); Class.forName(driverClassName);
log.info("成功加载数据库驱动程序"); log.info("成功加载数据库驱动程序");
} }
@ -116,7 +116,7 @@ public abstract class AbstractJdbcDataSourceProvider extends AbstractDataSourceP
Map<String, DataSourceProperty> dataSourcePropertiesMap = executeStmt(stmt); Map<String, DataSourceProperty> dataSourcePropertiesMap = executeStmt(stmt);
return createDataSourceMap(dataSourcePropertiesMap); return createDataSourceMap(dataSourcePropertiesMap);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error("loadDataSources error", e);
} finally { } finally {
closeResource(conn); closeResource(conn);
closeResource(stmt); closeResource(stmt);

View File

@ -274,7 +274,7 @@ public class DataSourceClassResolver {
//AnnotatedElementUtils.findMergedAnnotation()会委托给findMergedAnnotationAttributes() //AnnotatedElementUtils.findMergedAnnotation()会委托给findMergedAnnotationAttributes()
DS ds = AnnotatedElementUtils.findMergedAnnotation(ae, DS.class); DS ds = AnnotatedElementUtils.findMergedAnnotation(ae, DS.class);
if (ds != null) { if (ds != null) {
return (BasicAttribute<T>) new BasicAttribute<>(ds.value()); return new BasicAttribute(ds.value());
} }
} else if (annotation.isAssignableFrom(DSTransactional.class)) { } else if (annotation.isAssignableFrom(DSTransactional.class)) {
DSTransactional dsTransactional = AnnotatedElementUtils.findMergedAnnotation(ae, DSTransactional.class); DSTransactional dsTransactional = AnnotatedElementUtils.findMergedAnnotation(ae, DSTransactional.class);
@ -283,7 +283,7 @@ public class DataSourceClassResolver {
transactionalInfo.setPropagation(dsTransactional.propagation()); transactionalInfo.setPropagation(dsTransactional.propagation());
transactionalInfo.setRollbackFor(dsTransactional.rollbackFor()); transactionalInfo.setRollbackFor(dsTransactional.rollbackFor());
transactionalInfo.setNoRollbackFor(dsTransactional.noRollbackFor()); transactionalInfo.setNoRollbackFor(dsTransactional.noRollbackFor());
return (BasicAttribute<T>) new BasicAttribute(transactionalInfo); return new BasicAttribute(transactionalInfo);
} }
} }
return null; return null;

View File

@ -15,6 +15,7 @@
*/ */
package com.baomidou.dynamic.datasource.support; package com.baomidou.dynamic.datasource.support;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@ -22,7 +23,6 @@ import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.util.StringUtils;
import javax.sql.DataSource; import javax.sql.DataSource;
@ -50,7 +50,7 @@ public class ScriptRunner {
* @param location 脚本位置 * @param location 脚本位置
*/ */
public void runScript(DataSource dataSource, String location) { public void runScript(DataSource dataSource, String location) {
if (StringUtils.hasText(location)) { if (DsStrUtils.hasText(location)) {
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.setContinueOnError(continueOnError); populator.setContinueOnError(continueOnError);
populator.setSeparator(separator); populator.setSeparator(separator);

View File

@ -16,7 +16,6 @@
package com.baomidou.dynamic.datasource.toolkit; package com.baomidou.dynamic.datasource.toolkit;
import org.springframework.core.NamedThreadLocal; import org.springframework.core.NamedThreadLocal;
import org.springframework.util.StringUtils;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Deque; import java.util.Deque;
@ -66,7 +65,7 @@ public final class DynamicDataSourceContextHolder {
* @return 数据源名称 * @return 数据源名称
*/ */
public static String push(String ds) { public static String push(String ds) {
String dataSourceStr = StringUtils.isEmpty(ds) ? "" : ds; String dataSourceStr = DsStrUtils.isEmpty(ds) ? "" : ds;
LOOKUP_KEY_HOLDER.get().push(dataSourceStr); LOOKUP_KEY_HOLDER.get().push(dataSourceStr);
return dataSourceStr; return dataSourceStr;
} }

View File

@ -15,8 +15,8 @@
*/ */
package com.baomidou.dynamic.datasource.tx; package com.baomidou.dynamic.datasource.tx;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.UUID; import java.util.UUID;
@ -33,12 +33,7 @@ public final class LocalTxUtil {
/** /**
* SecureRandom instance used to generate UUIDs. * SecureRandom instance used to generate UUIDs.
*/ */
private static final ThreadLocal<SecureRandom> SECURE_RANDOM_HOLDER = new ThreadLocal<SecureRandom>() { private static final ThreadLocal<SecureRandom> SECURE_RANDOM_HOLDER = ThreadLocal.withInitial(SecureRandom::new);
@Override
protected SecureRandom initialValue() {
return new SecureRandom();
}
};
/** /**
* 随机生成UUID * 随机生成UUID
@ -75,7 +70,7 @@ public final class LocalTxUtil {
*/ */
public static String startTransaction() { public static String startTransaction() {
String xid = TransactionContext.getXID(); String xid = TransactionContext.getXID();
if (!StringUtils.isEmpty(xid)) { if (!DsStrUtils.isEmpty(xid)) {
log.debug("dynamic-datasource exist local tx [{}]", xid); log.debug("dynamic-datasource exist local tx [{}]", xid);
} else { } else {
xid = randomUUID().toString(); xid = randomUUID().toString();

View File

@ -15,9 +15,9 @@
*/ */
package com.baomidou.dynamic.datasource.tx; package com.baomidou.dynamic.datasource.tx;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.util.StringUtils;
import java.util.*; import java.util.*;
@ -28,7 +28,7 @@ public class TransactionContext {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
private static final ThreadLocal<Set<TransactionSynchronization>> SYNCHRONIZATION_HOLDER = private static final ThreadLocal<Set<TransactionSynchronization>> SYNCHRONIZATION_HOLDER =
ThreadLocal.withInitial(() -> new LinkedHashSet<>()); ThreadLocal.withInitial(LinkedHashSet::new);
/** /**
* Gets xid. * Gets xid.
@ -37,7 +37,7 @@ public class TransactionContext {
*/ */
public static String getXID() { public static String getXID() {
String xid = CONTEXT_HOLDER.get(); String xid = CONTEXT_HOLDER.get();
if (!StringUtils.isEmpty(xid)) { if (DsStrUtils.hasText(xid)) {
return xid; return xid;
} }
return null; return null;

View File

@ -16,9 +16,9 @@
package com.baomidou.dynamic.datasource.tx; package com.baomidou.dynamic.datasource.tx;
import com.baomidou.dynamic.datasource.exception.TransactionException; import com.baomidou.dynamic.datasource.exception.TransactionException;
import com.baomidou.dynamic.datasource.toolkit.DsStrUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.util.StringUtils;
import java.util.Objects; import java.util.Objects;
@ -107,7 +107,7 @@ public class TransactionalTemplate {
private Object doExecute(TransactionalExecutor transactionalExecutor) throws Throwable { private Object doExecute(TransactionalExecutor transactionalExecutor) throws Throwable {
TransactionalInfo transactionInfo = transactionalExecutor.getTransactionInfo(); TransactionalInfo transactionInfo = transactionalExecutor.getTransactionInfo();
DsPropagation propagation = transactionInfo.propagation; DsPropagation propagation = transactionInfo.propagation;
if (!StringUtils.isEmpty(TransactionContext.getXID()) && !propagation.equals(DsPropagation.NESTED)) { if (!DsStrUtils.isEmpty(TransactionContext.getXID()) && !propagation.equals(DsPropagation.NESTED)) {
return transactionalExecutor.execute(); return transactionalExecutor.execute();
} }
boolean state = true; boolean state = true;
@ -215,7 +215,7 @@ public class TransactionalTemplate {
* @return 是否存在事务 * @return 是否存在事务
*/ */
public boolean existingTransaction() { public boolean existingTransaction() {
return !StringUtils.isEmpty(TransactionContext.getXID()); return !DsStrUtils.isEmpty(TransactionContext.getXID());
} }
/** /**

14
pom.xml
View File

@ -54,13 +54,13 @@
<spring-boot-dependencies.version>2.7.15</spring-boot-dependencies.version> <spring-boot-dependencies.version>2.7.15</spring-boot-dependencies.version>
<mybatis.plus.version>3.5.3.2</mybatis.plus.version> <mybatis.plus.version>3.5.3.2</mybatis.plus.version>
<hikaricp.version>2.4.13</hikaricp.version> <hikaricp.version>2.4.13</hikaricp.version>
<druid.version>1.2.19</druid.version> <druid.version>1.2.20</druid.version>
<beeCp.version>3.4.1</beeCp.version> <beeCp.version>3.4.2</beeCp.version>
<commons-dbcp2.version>2.9.0</commons-dbcp2.version> <commons-dbcp2.version>2.10.0</commons-dbcp2.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<seata.version>1.4.2</seata.version> <seata.version>1.4.2</seata.version>
<lombok.version>1.18.30</lombok.version> <lombok.version>1.18.30</lombok.version>
<h2.version>2.2.222</h2.version> <h2.version>2.2.224</h2.version>
<atomikos.version>4.0.6</atomikos.version> <atomikos.version>4.0.6</atomikos.version>
<junit-jupiter.version>5.10.0</junit-jupiter.version> <junit-jupiter.version>5.10.0</junit-jupiter.version>
@ -69,13 +69,13 @@
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version> <maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version> <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version> <maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version> <maven-javadoc-plugin.version>3.6.0</maven-javadoc-plugin.version>
<maven-source-plugin.version>3.3.0</maven-source-plugin.version> <maven-source-plugin.version>3.3.0</maven-source-plugin.version>
<license-maven-plugin.version>4.2</license-maven-plugin.version> <license-maven-plugin.version>4.3</license-maven-plugin.version>
<maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version> <maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version>
<nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version> <nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version>
<native-maven-plugin.version>0.9.27</native-maven-plugin.version> <native-maven-plugin.version>0.9.28</native-maven-plugin.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>