web-dev-qa-db-ja.com

Maven「シェード」プラグインを使用してApacheCXFアプリケーションをモノリシックJARにパッケージ化する方法

私はコンソールベースのJavaアプリケーションを作成しています。これは、バッチ処理方式でcronによって実行されることを目的としています。バッチ処理アプリケーションは、JAX-WS用のApache CXFフレームワークを使用して、SOAPWebサービスを呼び出します。

デプロイメントを容易にし、CLASSPATHの問題を防ぐために、アプリケーション(すべての依存関係を含む)を単一のモノリシックJARファイルにバンドルしたいと思います... Mavenの「シェード」プラグイン を使用します。

私のアプリケーションは、Eclipseワークスペースから実行すると問題なく動作します。ただし、シェーディングされたJARファイルを実行しようとすると、次のようなスタックトレースが表示されます。

org.Apache.cxf.service.factory.ServiceConstructionException: Could not resolve a binding for null 
            at org.Apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createBindingInfo(AbstractWSDLBasedEndpointFactory.Java:404) 
            at org.Apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.Java:258) 
            at org.Apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.Java:146) 
            at org.Apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.Java:52) 
            at org.Apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.Java:102) 
            at org.Apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.Java:115) 
            at com.example.gui.domain.Session.getService(Session.Java:145) 
            at com.example.gui.domain.service.soap.AbstractServiceImpl.<init>(AbstractServiceImpl.Java:23) 
            at com.example.gui.domain.service.soap.GetUserConsoleOrgsImpl.<init>(GetUserConsoleOrgsImpl.Java:14) 
            at com.example.gui.domain.service.ServiceFactory.getGetUserConsoleOrgsService(ServiceFactory.Java:443) 
            at com.example.gui.domain.AccessManager.getOrgs(AccessManager.Java:62) 
            at com.example.gui.windows.ConsoleApplet.login (ConsoleApplet.Java:1253) 
            at com.example.gui.windows.ConsoleApplet.init(ConsoleApplet.Java:1227) 
            at Sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
            at Java.lang.Thread.run(Unknown Source) 
Caused by: org.Apache.cxf.BusException: No binding factory for namespace http://schemas.xmlsoap.org/soap/ registered. 
            at org.Apache.cxf.binding.BindingFactoryManagerImpl.getBindingFactory(BindingFactoryManagerImpl.Java:91) 
            at org.Apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createBindingInfo(AbstractWSDLBasedEndpointFactory.Java:394) 
            ... 14 more 
Java.lang.NullPointerException 
            at com.example.gui.domain.service.soap.GetUserConsoleOrgsImpl.getUserConsoleOrgs(GetUserConsoleOrgsImpl.Java:29) 
            at com.example.gui.domain.AccessManager.getOrgs(AccessManager.Java:64) 
            at com.example.gui.windows.ConsoleApplet.login (ConsoleApplet.Java:1253) 
            at com.example.gui.windows.ConsoleApplet.init(ConsoleApplet.Java:1227) 
            at Sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
            at Java.lang.Thread.run(Unknown Source) 

実際、 このディスカッション掲示板メッセージ をチェックアウトすると、この人が抱えているのとまったく同じ問題が発生します。そのスレッドで別の人が指摘したように、私の問題はおそらくMavenの「シェード」プラグインにあります。

Apache CXFは多数のJARファイルの依存関係で構成されており、明らかにそれらのJARの複数がMETA-INFディレクトリ内のコンテンツに依存しています。 Mavenの「シェード」プラグインは、これらすべてのMETA-INFディレクトリを1つにまとめ、必要なファイルをマージするのではなく上書きしているようです。

そのディスカッションスレッドの誰かが このMaven POMファイル へのリンクを提供し、「シェード」プラグインにこれ​​らのCXF依存関係を適切にマージさせるための構成オプションとトランスフォーマーがあることを示しています。次のように、これらの設定を自分のPOMに接続しました。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.MainClass</mainClass>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                        <projectName>Apache CXF</projectName>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/services/com.Sun.tools.xjc.Plugin</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.schemas</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/cxf/cxf.extension</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/extensions.xml</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/cxf/extensions.xml</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/cxf/bus-extensions.txt</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/cxf/bus-extensions.xml</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/wsdl.plugin.xml</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/tools.service.validator.xml</resource>
                    </transformer>
                    <transformer implementation="org.Apache.cxf.maven.PluginTransformer">
                        <resource>META-INF/tools-plugin.xml</resource>
                    </transformer>
                    <transformer
                        implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                        <resource>META-INF/cxf/Java2wsbeans.xml</resource>
                    </transformer>
                    <transformer implementation="org.Apache.cxf.maven.CXFAllTransformer" />
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

ただし、これらの設定が何をしているのかについての実際の説明は見つかりません...デバッグ出力を有効にしてMavenを実行すると、次のエラーが発生します。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:14.357s
[INFO] Finished at: Tue Jul 26 11:10:43 EDT 2011
[INFO] Final Memory: 18M/59M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.Apache.maven.plugins:maven-shade-plugin:1.4:shade (default) on project salestax-poster: Unable to parse configuration of mojo org.Apache.maven.plugins:maven-shade-plugin:1.4:shade: ClassNotFoundException: Class name which was explicitly given in configuration using 'implementation' attribute: 'org.Apache.cxf.maven.PluginTransformer' cannot be loaded -> [Help 1]
org.Apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.Apache.maven.plugins:maven-shade-plugin:1.4:shade (default) on project salestax-poster: Unable to parse configuration of mojo org.Apache.maven.plugins:maven-shade-plugin:1.4:shade: ClassNotFoundException: Class name which was explicitly given in configuration using 'implementation' attribute: 'org.Apache.cxf.maven.PluginTransformer' cannot be loaded
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:221)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:84)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:59)
...

org.Apache.cxf.maven.PluginTransformerパッケージに存在するように見えるcxf-buildtoolsクラスが見つからないという不満のようです。ただし、そのパッケージをPOMの依存関係に追加すると、ビルドプロセスでさらに別のエラーが発生します。

Jul 26, 2011 10:44:02 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.Apache.cxf.bus.spring.BusApplicationContext@3aa42c31: display name [org.Apache.cxf.bus.spring.BusApplicationContext@3aa42c31]; startup date [Tue Jul 26 10:44:02 EDT 2011]; root of context hierarchy
Jul 26, 2011 10:44:02 AM org.Apache.cxf.bus.spring.BusApplicationContext getConfigResources
INFO: No cxf.xml configuration file detected, relying on defaults.
Jul 26, 2011 10:44:02 AM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
INFO: Bean factory for application context [org.Apache.cxf.bus.spring.BusApplicationContext@3aa42c31]: org.springframework.beans.factory.support.DefaultListableBeanFactory@47fe1e26
Jul 26, 2011 10:44:02 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@47fe1e26: defining beans [cxf,org.Apache.cxf.bus.spring.BusApplicationListener,org.Apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor,org.Apache.cxf.bus.spring.Jsr250BeanPostProcessor,org.Apache.cxf.bus.spring.BusExtensionPostProcessor,org.Apache.cxf.resource.ResourceManager,org.Apache.cxf.configuration.Configurer,org.Apache.cxf.binding.BindingFactoryManager,org.Apache.cxf.transport.DestinationFactoryManager,org.Apache.cxf.transport.ConduitInitiatorManager,org.Apache.cxf.wsdl.WSDLManager,org.Apache.cxf.phase.PhaseManager,org.Apache.cxf.workqueue.WorkQueueManager,org.Apache.cxf.buslifecycle.BusLifeCycleManager,org.Apache.cxf.endpoint.ServerRegistry,org.Apache.cxf.endpoint.ServerLifeCycleManager,org.Apache.cxf.endpoint.ClientLifeCycleManager,org.Apache.cxf.transports.http.QueryHandlerRegistry,org.Apache.cxf.endpoint.EndpointResolverRegistry,org.Apache.cxf.headers.HeaderManager,org.Apache.cxf.catalog.OASISCatalogManager,org.Apache.cxf.endpoint.ServiceContractResolverRegistry]; root of factory hierarchy
[DEBUG] 
Java.lang.AbstractMethodError: org.Apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.startElement(Stax2DOM.Java:173)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:135)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:95)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:76)
    at org.Apache.cxf.tools.validator.internal.WSDL11Validator.getWSDLDoc(WSDL11Validator.Java:91)
    at org.Apache.cxf.tools.validator.internal.WSDL11Validator.isValid(WSDL11Validator.Java:111)
    at org.Apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.validate(JAXWSDefinitionBuilder.Java:201)
    at org.Apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.validate(JAXWSDefinitionBuilder.Java:61)
    at org.Apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.Java:132)
    at org.Apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.Java:238)
    at org.Apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.Java:83)
    at org.Apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.Java:103)
    at org.Apache.cxf.maven_plugin.WSDL2JavaMojo.processWsdl(WSDL2JavaMojo.Java:360)
    at org.Apache.cxf.maven_plugin.WSDL2JavaMojo.execute(WSDL2JavaMojo.Java:257)
    at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:101)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:209)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:84)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:59)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.Java:183)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:161)
    at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:319)
    at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:156)
    at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:537)
    at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:196)
    at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:141)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.Java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:352)
Jul 26, 2011 10:44:03 AM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.Apache.cxf.bus.spring.BusApplicationContext@3aa42c31: display name [org.Apache.cxf.bus.spring.BusApplicationContext@3aa42c31]; startup date [Tue Jul 26 10:44:02 EDT 2011]; root of context hierarchy
Jul 26, 2011 10:44:03 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@47fe1e26: defining beans [cxf,org.Apache.cxf.bus.spring.BusApplicationListener,org.Apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor,org.Apache.cxf.bus.spring.Jsr250BeanPostProcessor,org.Apache.cxf.bus.spring.BusExtensionPostProcessor,org.Apache.cxf.resource.ResourceManager,org.Apache.cxf.configuration.Configurer,org.Apache.cxf.binding.BindingFactoryManager,org.Apache.cxf.transport.DestinationFactoryManager,org.Apache.cxf.transport.ConduitInitiatorManager,org.Apache.cxf.wsdl.WSDLManager,org.Apache.cxf.phase.PhaseManager,org.Apache.cxf.workqueue.WorkQueueManager,org.Apache.cxf.buslifecycle.BusLifeCycleManager,org.Apache.cxf.endpoint.ServerRegistry,org.Apache.cxf.endpoint.ServerLifeCycleManager,org.Apache.cxf.endpoint.ClientLifeCycleManager,org.Apache.cxf.transports.http.QueryHandlerRegistry,org.Apache.cxf.endpoint.EndpointResolverRegistry,org.Apache.cxf.headers.HeaderManager,org.Apache.cxf.catalog.OASISCatalogManager,org.Apache.cxf.endpoint.ServiceContractResolverRegistry]; root of factory hierarchy
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.152s
[INFO] Finished at: Tue Jul 26 10:44:03 EDT 2011
[INFO] Final Memory: 10M/59M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.Apache.cxf:cxf-codegen-plugin:2.2:wsdl2Java (generate-sources) on project salestax-poster: org.Apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object; -> [Help 1]
org.Apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.Apache.cxf:cxf-codegen-plugin:2.2:wsdl2Java (generate-sources) on project salestax-poster: org.Apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:217)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:84)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:59)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.Java:183)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:161)
    at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:319)
    at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:156)
    at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:537)
    at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:196)
    at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:141)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.Java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:352)
Caused by: org.Apache.maven.plugin.MojoExecutionException: org.Apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.Apache.cxf.maven_plugin.WSDL2JavaMojo.processWsdl(WSDL2JavaMojo.Java:363)
    at org.Apache.cxf.maven_plugin.WSDL2JavaMojo.execute(WSDL2JavaMojo.Java:257)
    at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:101)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:209)
    ... 19 more
Caused by: Java.lang.AbstractMethodError: org.Apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.startElement(Stax2DOM.Java:173)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:135)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:95)
    at org.Apache.cxf.tools.validator.internal.Stax2DOM.getDocument(Stax2DOM.Java:76)
    at org.Apache.cxf.tools.validator.internal.WSDL11Validator.getWSDLDoc(WSDL11Validator.Java:91)
    at org.Apache.cxf.tools.validator.internal.WSDL11Validator.isValid(WSDL11Validator.Java:111)
    at org.Apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.validate(JAXWSDefinitionBuilder.Java:201)
    at org.Apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11.JAXWSDefinitionBuilder.validate(JAXWSDefinitionBuilder.Java:61)
    at org.Apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.Java:132)
    at org.Apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.Java:238)
    at org.Apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.Java:83)
    at org.Apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.Java:103)
    at org.Apache.cxf.maven_plugin.WSDL2JavaMojo.processWsdl(WSDL2JavaMojo.Java:360)
    ... 22 more

MavenシェーディングJARのコンテキストでApacheCXFを使用したことがあり、これを適切に機能させる方法についてガイダンスを提供できる人はいますか?

25
Steve Perkins

私は多かれ少なかれ問題を解決しました。

Mavenの「シェード」プラグインには「トランスフォーマー」の概念が付属しています。これにより、一方が他方を上書きするのではなく、競合するファイルをモノリシックJARにマージできます。変圧器にはさまざまな種類があります...最も一般的なものは次のとおりです。

  • org.Apache.maven.plugins.shade.resource.AppendingTransformer-あるテキストファイルを別のテキストファイルの末尾に追加するだけです
  • org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer-フォーマットを適切に保ちながら、XMLを一緒に追加します

上記のPOMスニペットでは、そのディスカッション掲示板スレッドで提供されている例からトランスフォーマーのリストを取得しました。これには、デフォルトの「シェード」プラグインの一部ではない2つのトランスフォーマーが含まれていました。

  • org.Apache.cxf.maven.PluginTransformer
  • org.Apache.cxf.maven.CXFAllTransformer

どうやら、これら2つは「シェード」プラグインに付属していないCXF固有のアドオンですが、CXFJARによって個別に提供する必要があります。

これらの依存関係を適切に設定する方法を理解できなかったため、私の「解決策」は不完全です。それらはcxf-buildtools Maven依存関係パッケージの一部のようです...しかし、上記の質問文書のように、その依存関係をPOMに挿入しようとしても、問題が発生しました。

ただし、実際には、私の解決策は、これら2つのトランスフォーマーを「シェード」プラグイン構成から完全に削除することでした。私のシェーディングされたJARアプリケーションは、それらがなくても完全に正常に動作します。おそらく、これら2つの特定のトランスフォーマーは、特別なEdgeの場合に役割を果たしますが、Vanilla CXFサービス呼び出しの場合、それらを省略できるようです。

3
Steve Perkins

私の場合、追加する必要があるのは次のとおりです。

<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
     <resource>META-INF/cxf/bus-extensions.txt</resource>
</transformer>

トランスフォーマータグがある場合とない場合のこのファイルを見ると、大きな違いがあります(1行のみと約50行)、特に次の行です。

org.Apache.cxf.binding.soap.SoapBindingFactory::true
org.Apache.cxf.binding.soap.SoapTransportFactory::true

問題を引き起こしていると私が信じている行方不明です。

21
Eugen

解決策は、cxf-buildtoolsの依存関係をプラグイン要素に追加することです。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
        <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>## you name class name ##</mainClass>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/services/com.Sun.tools.xjc.Plugin</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/cxf/cxf.extension</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/extensions.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/cxf/extensions.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/cxf/bus-extensions.txt</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/cxf/bus-extensions.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/wsdl.plugin.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/tools.service.validator.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.cxf.maven.PluginTransformer">
                                <resource>META-INF/tools-plugin.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.maven.plugins.shade.resource.XmlAppendingTransformer">
                                <resource>META-INF/cxf/Java2wsbeans.xml</resource>
                            </transformer>
                            <transformer implementation="org.Apache.cxf.maven.CXFAllTransformer" />
                        </transformers>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <shadedClassifierName>executable</shadedClassifierName>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.Apache.cxf</groupId>
                    <artifactId>cxf-buildtools</artifactId>
                    <version>2.2.12</version>
                    <type>jar</type>
                    <scope>compile</scope>
                </dependency>
            </dependencies>
        </plugin>
21

前の応答に加えて、プロジェクトに含まれる依存関係(私の場合はjaxb-impl-2.2.11.jar)に対応するオブジェクトJAXBContextを使用するために、連結する必要もありますMETA-INF/services/javax.xml.bind.JAXBContext like

case PathList( "META-INF"、 "services"、 "javax.xml.bind.JAXBContext"、xs @ _ *)=> MergeStrategy.concat

sBT、またはMavenの同等のもの。

それ以外の場合、使用されるJAXBContextはJVMのものになります。私の例では、これを取得していました。

JAXBContext "jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/rt.jar!/ com/Sun/xml/internal/bind/v2/runtime/JAXBContextImplを作成しました。クラスBuild-Id:1.8.0_45

1
fjab

念のため、cxfとshadeプラグインでキャメルを使用している場合は、ファイルMETA-INF/services/org/Apache/camel/TypeConverterTypeConverterを「変換」することを忘れないでください。 (3時間失われました)

<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
  <resource>META-INF/services/org/Apache/camel/TypeConverter</resource>
</transformer>
1
Αλέκος

私はそれを次のように解決しました:

基本的に、cxfライブラリはそれぞれMETA-INF/cxf/bus-extensions.txtファイルを提供し、パッケージャのデフォルトの動作はそのファイルを置き換えることであり、ファイルが不完全になります。 cxfのものを置き換える代わりに追加するようにシェーダーを構成することにより、正しく動作します。

プラグインセクションのpomのビルドセクションにこれを追加します。

  <plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.4</version>
    <configuration>
      <createDependencyReducedPom>true</createDependencyReducedPom>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
              <resource>META-INF/cxf/bus-extensions.txt</resource>
            </transformer>
          </transformers>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        </configuration>
      </execution>
    </executions>
  </plugin>