Mina 在 Netbeans 上工作并在 fat-jar 中失败了?
Mina working on Netbeans and fails in a fat-jar?
奇怪的问题,如果我们创建一个 fat-jar 来执行项目而不是来自 Netbeans,它会失败。知道为什么吗?
这是一个简单的 apache-camel 应用程序,它使用 Mina 启动一个路由来接收 HL7,然后使用一个直接回答 ACK 消息的 bean,一个简单的示例。
<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec">
<property name="charset" value="utf-8"/>
</bean>
<bean id="answerACKHL7" class="com.mycompany.AnswerEMRBean" />
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route customId="true" id="routeID">
<from uri="mina:tcp://localhost:8255?sync=true&codec=#hl7codec" />
<bean ref="answerACKHL7" method="sendACK" />
</route>
</camelContext>
该应用程序有另一个 java 定义的 REST 路由,但这部分在 Netbeans 和执行 jar 文件中的工作方式相同。
如果我们 运行 它来自 Netbeans 并向它工作的端口发送 HL7 消息。好的,我们用 maven-shade-plugin 3.2.4 和 运行 用 java -jar jarfile.jar 构建一个 fat-jar 一切似乎开始正常然后我们发送相同的 HL7 消息如果 运行ning 从 netbeans 得到异常,则工作。
错误消息的副本:
GRAVE:无法交付(MessageId:ID-DESKTOP-O7B5GIN-1603385955728-0-1 在 ExchangeId:ID-DESKTOP-O7B5GIN-1603385955728-0-1 上)。尝试交付后耗尽:1 次捕获:org.apache.camel.CamelExecutionException:在交易所执行期间发生异常:Exchange[]
消息历史记录(禁用完整的消息历史记录)
RouteId ProcessorId Processor Elapsed (ms)
[routeID ] [routeID ] [from[mina://tcp://localhost:8255?codec=%23hl7codec&sync=true] ] [ 45]
...
[routeID ] [bean1 ] [bean[ref:answerACKHL7 method:sendACK] ] [ 0]
堆栈跟踪
org.apache.camel.CamelExecutionException: Exception occurred during
execution on the exchange: Exchange[]
at org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:47)
at org.apache.camel.support.builder.ExpressionBuilder.evaluate(ExpressionBuilder.java:943)
at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)
at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterBinding(MethodInfo.java:748)
at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterExpressions(MethodInfo.java:640)
at
org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluate(MethodInfo.java:608)
at org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:195)
at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:265)
at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:135)
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:56)
at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:395)
at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:147)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:286)
at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83)
at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:40)
at org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.messageReceived(MinaConsumer.java:409)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:1015)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access00(DefaultIoFilterChain.java:49)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl.messageReceived(DefaultIoFilterChain.java:1128)
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:106)
at org.apache.mina.core.session.IoEvent.run(IoEvent.java:89)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:766)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758)
at
org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:697)
at java.lang.Thread.run(Unknown Source) Caused by: org.apache.camel.InvalidPayloadException: No body available of type:
ca.uhn.hl7v2.model.Message but has value: ... copy of all the message here ... of type:
java.lang.String on: Message. Caused by: No type converter available
to convert from type: java.lang.String to the required type:
ca.uhn.hl7v2.model.Message with value ... copy of all the HL7 message... . Exchange[].
Caused by: [org.apache.camel.NoTypeConversionAvailableException - No
type converter available to convert from type: java.lang.String to the
required type: ca.uhn.hl7v2.model.Message with value ... copy of all the HL7 message
again... ]
at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:118)
at org.apache.camel.support.builder.ExpressionBuilder.evaluate(ExpressionBuilder.java:941)
... 26 more Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter
available to convert from type: java.lang.String to the required type:
ca.uhn.hl7v2.model.Message with value ...
at org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:216)
at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:116)
... 27 more oct 22, 2020 6:59:15 PM org.apache.camel.component.mina.MinaConsumer$ReceiveHandler
exceptionCaught ADVERTENCIA: Closing session as an exception was
thrown from MINA oct 22, 2020 6:59:15 PM
org.apache.mina.core.filterchain.DefaultIoFilterChain
callNextExceptionCaught ADVERTENCIA: Unexpected exception from
exceptionCaught handler. org.apache.camel.CamelException:
org.apache.mina.filter.codec.ProtocolEncoderException:
org.apache.camel.CamelExecutionException: Exception occurred during
execution on the exchange: Exchange[]
at org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.exceptionCaught(MinaConsumer.java:387)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.exceptionCaught(DefaultIoFilterChain.java:987)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:706)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access00(DefaultIoFilterChain.java:49)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl.exceptionCaught(DefaultIoFilterChain.java:1110)
at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:97)
at org.apache.mina.core.session.IoEvent.run(IoEvent.java:89)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:766)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758)
at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:697)
at java.lang.Thread.run(Unknown Source)
...
更多信息
骆驼版本3.2.0
Java 版本 1.8.0.221(在 Netbeans 和命令行中应该相同)
知道为什么构建 jar 失败了吗???
此致。
由于依赖于 fat jar 的阴影,您需要指示 maven 插件如何处理重复资源。在您的情况下, maven-shade-plugin
覆盖 TypeConverterLoader
负责类型转换,因此您得到
No type converter available to convert from type: java.lang.String to the required type
异常。
您需要配置 maven-shade-plugin
以合并此资源。见 How to create executable JAR for camel-main project:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>executable-jar</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>my.package.MainClass</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/org/apache/camel/TypeConverterLoader</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
奇怪的问题,如果我们创建一个 fat-jar 来执行项目而不是来自 Netbeans,它会失败。知道为什么吗?
这是一个简单的 apache-camel 应用程序,它使用 Mina 启动一个路由来接收 HL7,然后使用一个直接回答 ACK 消息的 bean,一个简单的示例。
<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec">
<property name="charset" value="utf-8"/>
</bean>
<bean id="answerACKHL7" class="com.mycompany.AnswerEMRBean" />
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route customId="true" id="routeID">
<from uri="mina:tcp://localhost:8255?sync=true&codec=#hl7codec" />
<bean ref="answerACKHL7" method="sendACK" />
</route>
</camelContext>
该应用程序有另一个 java 定义的 REST 路由,但这部分在 Netbeans 和执行 jar 文件中的工作方式相同。
如果我们 运行 它来自 Netbeans 并向它工作的端口发送 HL7 消息。好的,我们用 maven-shade-plugin 3.2.4 和 运行 用 java -jar jarfile.jar 构建一个 fat-jar 一切似乎开始正常然后我们发送相同的 HL7 消息如果 运行ning 从 netbeans 得到异常,则工作。
错误消息的副本: GRAVE:无法交付(MessageId:ID-DESKTOP-O7B5GIN-1603385955728-0-1 在 ExchangeId:ID-DESKTOP-O7B5GIN-1603385955728-0-1 上)。尝试交付后耗尽:1 次捕获:org.apache.camel.CamelExecutionException:在交易所执行期间发生异常:Exchange[]
消息历史记录(禁用完整的消息历史记录)
RouteId ProcessorId Processor Elapsed (ms)
[routeID ] [routeID ] [from[mina://tcp://localhost:8255?codec=%23hl7codec&sync=true] ] [ 45]
...
[routeID ] [bean1 ] [bean[ref:answerACKHL7 method:sendACK] ] [ 0]
堆栈跟踪
org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[] at org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:47) at org.apache.camel.support.builder.ExpressionBuilder.evaluate(ExpressionBuilder.java:943) at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterBinding(MethodInfo.java:748) at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterExpressions(MethodInfo.java:640) at org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluate(MethodInfo.java:608) at org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:195) at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:265) at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:135) at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:56) at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:395) at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148) at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60) at org.apache.camel.processor.Pipeline.process(Pipeline.java:147) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:286) at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) at org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:40) at org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.messageReceived(MinaConsumer.java:409) at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:1015) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access00(DefaultIoFilterChain.java:49) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl.messageReceived(DefaultIoFilterChain.java:1128) at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:106) at org.apache.mina.core.session.IoEvent.run(IoEvent.java:89) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:766) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:697) at java.lang.Thread.run(Unknown Source) Caused by: org.apache.camel.InvalidPayloadException: No body available of type: ca.uhn.hl7v2.model.Message but has value: ... copy of all the message here ... of type: java.lang.String on: Message. Caused by: No type converter available to convert from type: java.lang.String to the required type: ca.uhn.hl7v2.model.Message with value ... copy of all the HL7 message... . Exchange[]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: java.lang.String to the required type: ca.uhn.hl7v2.model.Message with value ... copy of all the HL7 message again... ] at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:118) at org.apache.camel.support.builder.ExpressionBuilder.evaluate(ExpressionBuilder.java:941) ... 26 more Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.lang.String to the required type: ca.uhn.hl7v2.model.Message with value ... at org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:216) at org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:116) ... 27 more oct 22, 2020 6:59:15 PM org.apache.camel.component.mina.MinaConsumer$ReceiveHandler exceptionCaught ADVERTENCIA: Closing session as an exception was thrown from MINA oct 22, 2020 6:59:15 PM org.apache.mina.core.filterchain.DefaultIoFilterChain callNextExceptionCaught ADVERTENCIA: Unexpected exception from exceptionCaught handler. org.apache.camel.CamelException: org.apache.mina.filter.codec.ProtocolEncoderException: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[] at org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.exceptionCaught(MinaConsumer.java:387) at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.exceptionCaught(DefaultIoFilterChain.java:987) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:706) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access00(DefaultIoFilterChain.java:49) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl.exceptionCaught(DefaultIoFilterChain.java:1110) at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:97) at org.apache.mina.core.session.IoEvent.run(IoEvent.java:89) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:766) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758) at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:697) at java.lang.Thread.run(Unknown Source)
...
更多信息
骆驼版本3.2.0 Java 版本 1.8.0.221(在 Netbeans 和命令行中应该相同)
知道为什么构建 jar 失败了吗???
此致。
由于依赖于 fat jar 的阴影,您需要指示 maven 插件如何处理重复资源。在您的情况下, maven-shade-plugin
覆盖 TypeConverterLoader
负责类型转换,因此您得到
No type converter available to convert from type: java.lang.String to the required type
异常。
您需要配置 maven-shade-plugin
以合并此资源。见 How to create executable JAR for camel-main project:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>executable-jar</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>my.package.MainClass</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/org/apache/camel/TypeConverterLoader</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>