在 intellij 中运行并执行 jar 时的细微差异
Posted
技术标签:
【中文标题】在 intellij 中运行并执行 jar 时的细微差异【英文标题】:Subtle diff when running in intellij and executing jar 【发布时间】:2018-05-06 17:01:50 【问题描述】:我的想法已经不多了......
当我在 indellij 中运行我的 Spring Boot 应用程序并且 应用了 gradle idea 插件(应用插件:'idea')时,它的行为正常。 一旦我从 build.gradle 中删除插件,它的行为类似于使用 java -jar app.jar 执行的应用程序 - 存在细微但重要的区别,如下所述。
我有以下情况,当前 tx 由于某些异常而失败,tx 被标记为仅回滚,异常被捕获,其处理包括使用 TransactionSynchronizationManager.registerSynchronization 注册 tx 恢复活动(新交易)。
代码在带有idea插件的intellij中运行良好,当我删除插件声明或使用java -jar运行spring boot jar时,注册过程(发送失败任务)失败并出现异常:
Caused by: java.lang.IllegalStateException: Transaction synchronization is not active
at org.springframework.transaction.support.TransactionSynchronizationManager.registerSynchronization(TransactionSynchronizationManager.java:291) ~[spring-tx-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
顺便说一句,如果重要的话,代码在 kotlin 中。 有什么想法吗?
更新
我认为存在某种竞争条件,因为在调试模式下,即使没有想法插件,应用程序也会按预期运行(注册过程成功)。
【问题讨论】:
【参考方案1】:我解决了我的问题,根本原因令人惊讶......
显然,自定义 Spring 注解的正确处理存在问题。 应该打开新事务的方法没有使用标准的@Transactional 注释进行注释,而是使用自定义的应用程序特定注释(@Transactional 与自定义 tx 设置)。调试会话显示新的 tx 未打开。而已!内联自定义注释几乎解决了一个问题。 我检测到的另一个缺陷是一个未打开的函数,这很奇怪,因为该函数不是事务入口点(som 进一步调用)。
Kotlin 编译器错误? 无论如何,经验教训 - 注意自定义注释行为;刷新关于final/open规则的知识。
【讨论】:
以上是关于在 intellij 中运行并执行 jar 时的细微差异的主要内容,如果未能解决你的问题,请参考以下文章
运行使用 maven 构建的 jar 时的 FlinkMLTools NoClassDef
如何在 IntelliJ 中以不同用户身份运行 JAR 应用程序?
如何像在 Eclipse 中一样在 IntelliJ 中创建可运行的 JAR
如何像在 Eclipse 中一样在 IntelliJ 中创建可运行的 JAR