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&amp;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>