在 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

从 intellij idea 运行多个 jar 文件并进行更改、运行和调试。

IntelliJ IDEA中生成jar包并运行