【发布时间】:2018-01-05 06:18:29
【问题描述】:
我创建了一个 jar 文件,其中包含一个由 Spring 服务包装的 Ruby gem (activemerchant),该服务使用 JRuby ScriptContainer 来调用一个使用 ruby gem 的小型 Ruby 脚本。这个 jar 的单元测试在 Ruby gem 上都可以正常工作 - gem 被拾取并按预期运行。
jar 包含以下文件夹:
com
... <not relevant> ...
gateways
... <not relevant> ...
gems
activemerchant-1.75.0
activesupport-5.2.0.beta2
builder-3.2.3
concurrent-ruby-1.0.5-java
i18n-0.9.1
minitest-5.11.1
nokogiri-1.8.1-java
thread_safe-0.3.6-java
tzinfo-1.2.4
META-INF
MANIFEST.MF
scripts
main.rb
specifications
activemerchant-1.75.0.gemspec
activesupport-5.2.0.beta2.gemspec
builder-3.2.3.gemspec
concurrent-ruby-1.0.5-java.gemspec
i18n-0.9.1.gemspec
minitest-5.11.1.gemspec
nokogiri-1.8.1-java.gemspec
thread_safe-0.3.6-java.gemspec
tzinfo-1.2.4.gemspec
jar 嵌入到使用嵌入式 Tomcat 容器的 Spring Boot 应用程序中。启动 Spring Boot 应用程序时,出现错误:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'activeMerchantGatewayProvider': Invocation of init method failed; nested exception is org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- activemerchant
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:220)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1088)
at com.mydomain.financial.gateway.GatewayService.lambda$init$0(GatewayService.java:39)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.mydomain.financial.gateway.GatewayService.init(GatewayService.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:310)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
... 81 common frames omitted
Caused by: org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- activemerchant
at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:131)
at org.jruby.embed.ScriptingContainer.runUnit(ScriptingContainer.java:1307)
at org.jruby.embed.ScriptingContainer.runScriptlet(ScriptingContainer.java:1352)
at com.mydomain.financial.gateway.activemerchant.ActiveMerchantGatewayProvider.init(ActiveMerchantGatewayProvider.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:365)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:310)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
... 108 common frames omitted
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- activemerchant
at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:955)
at uri_3a_classloader_3a_.META_minus_INF.jruby_dot_home.lib.ruby.stdlib.rubygems.core_ext.kernel_require.require(uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:55)
at RUBY.<main>(classpath:/scripts/main.rb:2)
如何让 Spring Boot 嵌入式 Tomcat/JRuby 识别嵌入式 jar 中的 gem?
【问题讨论】:
-
有接受者吗?我把嵌入jar的内容分解到spring boot jar的classes目录下。没有帮助。
标签: java spring-boot jruby