JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目

Posted

技术标签:

【中文标题】JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目【英文标题】:AWS Java SDK on JBoss AS7 - module.xml entries 【发布时间】:2015-04-17 07:56:22 【问题描述】:

我在 JBoss AS 7.1 (EE6) 项目中使用新的 AmazonAWS SDK 时遇到问题

我只是使用S3库,所以按照新版本(1.9.7)我只使用s3、core、kms jars

-aws-java-sdk-core-1.9.17.jar
-aws-java-sdk-s3-1.9.17.jar
-aws-java-sdk-kms-1.9.17.jar

所以我为 /com/amazonaws 目录中的每个 jar 创建了 3 个单独的 module.xml 条目:

/com/amazonaws/aws-java-sdk-s3/main/module.xml

<module xmlns="urn:jboss:module:1.1" name="com.amazonaws.aws-java-sdk-s3">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="aws-java-sdk-s3-1.9.17.jar"/>
        <!-- Insert resources here -->
    </resources>

    <dependencies>
        <module name="com.amazonaws.aws-java-sdk-core" />
        <module name="com.amazonaws.aws-java-sdk-kms" />
    </dependencies>
</module>

/com/amazonaws/aws-java-sdk-kms/main/module.xml

<resources>
    <resource-root path="aws-java-sdk-kms-1.9.17.jar"/>
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="com.amazonaws.aws-java-sdk-core" />
</dependencies>

/com/amazonaws/aws-java-sdk-core/main/module.xml

<module xmlns="urn:jboss:module:1.1" name="com.amazonaws.aws-java-sdk-core">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="aws-java-sdk-core-1.9.17.jar"/>
        <resource-root path="commons-logging-1.1.3.jar"/>
        <resource-root path="httpclient-4.3.4.jar"/>
        <resource-root path="jackson-databind-2.3.2.jar"/>
        <resource-root path="joda-time-2.2.jar"/>

        <!-- Insert resources here -->
    </resources>

</module>

(我已将额外的依赖项,例如 apache-commons、jodatime 等直接放在模块目录中)

以下 jboss-deployment-structure.xml 条目:

  <sub-deployment name="Processor-ejb.jar">
    <dependencies>
        <module name="com.amazonaws.aws-java-sdk-core" />
        <module name="com.amazonaws.aws-java-sdk-s3" />
        <module name="com.amazonaws.aws-java-sdk-kms" />

    </dependencies>
  </sub-deployment>

(我也尝试使用 export=true 将这些声明为 EAR 级别的依赖项)

以下 pom.xml 条目:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.9.17</version>
    <scope>provided</scope>
</dependency>

但是每当我尝试初始化一个新的 S3 客户端时:

AWSCredentials credentials = new ProfileCredentialsProvider("ProcessingApp").getCredentials();
AmazonS3 s3 = new AmazonS3Client(credentials);

我得到以下异常:

Caused by: java.lang.NoClassDefFoundError: javax/management/MalformedObjectNameException
    at com.amazonaws.jmx.SdkMBeanRegistrySupport.registerMetricAdminMBean(SdkMBeanRegistrySupport.java:27)
    at com.amazonaws.metrics.AwsSdkMetrics.registerMetricAdminMBean(AwsSdkMetrics.java:330)
    at com.amazonaws.metrics.AwsSdkMetrics.<clinit>(AwsSdkMetrics.java:308)
    at com.amazonaws.services.s3.AmazonS3Client.<clinit>(AmazonS3Client.java:261)
    at net.processor.actions.scheduled.ScheduledActionsBean.minuteActions(ScheduledActionsBean.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [classes.jar:1.6.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [classes.jar:1.6.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [classes.jar:1.6.0_65]
    at java.lang.reflect.Method.invoke(Method.java:597) [classes.jar:1.6.0_65]
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptorFactory.java:72) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:374) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]
    at org.jboss.seam.intercept.EJBInvocationContext.proceed(EJBInvocationContext.java:44)
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
    at org.jboss.seam.intercept.Interceptor.aroundTimeout(Interceptor.java:201)
    at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:74)
    at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79)
    ... 56 more

我的预感会与 apache-commons-logging 发生冲突,因为 SdkMBeanRegistrySupport 类中有一个导入,而且我知道 JBoss 在其他地方使用这个库,使用 org.slf4j.jcl-over-slf4j 的别名,但我认为将 apache lib 与 jar 一起放入会解决这个问题吗?

我对 AS7 还很陌生,所以也许我错过了一个技巧?

【问题讨论】:

尝试在 com.amazonaws.aws-java-sdk-core 中添加 &lt;module name="javax.api"/&gt; 作为依赖项 module.xml 是的,你是对的,这让我摆脱了那个异常并走上了正确的道路......谢谢 【参考方案1】:

好的,感谢@Federico Sierra,我终于得到了,这是 sdk-core module.xml(nb。我不得不将 commons-logging、httpclient 和 httpcore jar 放到模块文件夹中,因为 JBoss 附带的那些不兼容,我将jackson和joda libs添加为自己的模块)...

<module xmlns="urn:jboss:module:1.1" name="com.amazonaws.aws-java-sdk-core">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="aws-java-sdk-core-1.9.17.jar"/>
        <resource-root path="commons-logging-1.1.3.jar"/>
        <resource-root path="httpclient-4.3.4.jar"/>
        <resource-root path="httpcore-4.3.2.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.xml.stream.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="com.fasterxml.jackson"/>
        <module name="org.joda.time"/>
    </dependencies>

</module>

sdk-s3 module.xml 也需要 javax.xml.stream.api

<resources>
    <resource-root path="aws-java-sdk-s3-1.9.17.jar"/>
    <!-- Insert resources here -->
</resources>

<dependencies>
    <module name="com.amazonaws.aws-java-sdk-core" />
    <module name="com.amazonaws.aws-java-sdk-kms" />
    <module name="javax.xml.stream.api"/>
</dependencies>

希望这对其他人有帮助

【讨论】:

非常感谢,我实际上为此创建了一个 Maven 程序集描述符。也许这对某人有帮助:github.com/Sweazer/jgroups-native-s3-ping/blob/master/src/main/… 哦,好项目!它适用于 JBoss AS7.2 吗?还是只是 Wildfly? 我只用 Wildfly 对其进行了测试,但我看不出它有任何不工作的原因。模块 urn 版本在 AS7.2 上可能不同,但除此之外,应该是相同的。【参考方案2】:

我想分享我的代码,它对我有用,希望对你有用

<module xmlns="urn:jboss:module:1.5" name="com.amazonaws.aws-java-sdk-s3">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="aws-java-sdk-s3-1.11.106.jar"/>
        <resource-root path="aws-java-sdk-core-1.11.106.jar"/>
        <resource-root path="aws-java-sdk-kms-1.11.106.jar"/>
        <resource-root path="jmespath-java-1.11.106.jar"/>
        <resource-root path="commons-logging-1.1.1.jar"/>
        <resource-root path="httpclient-4.5.2.redhat-1.jar"/>
        <resource-root path="httpcore-4.4.4.redhat-1.jar"/>
        <resource-root path="jackson-annotations-2.8.9.redhat-1.jar"/>
        <resource-root path="jackson-databind-2.8.9.redhat-1.jar"/>
        <resource-root path="jackson-core-2.8.9.redhat-1.jar"/>
        <resource-root path="jackson-dataformat-cbor-2.6.6.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="javax.xml.stream.api"/>
        <module name="org.joda.time"/>
    </dependencies>
</module>

我在 jboss 中只使用一个文件夹“com/amazonaws/aws-java-sdk-s3”,我把所有的罐子放在那里。

【讨论】:

你能告诉我你的 pom.xml 是什么样的吗?因为我仍然无法让我的代码加载模块..

以上是关于JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目的主要内容,如果未能解决你的问题,请参考以下文章

JBoss AS7部署插件(jboss-as-maven-plugin)

JBoss AS 7 上的 HttpTunnelingServlet

使用带有 JBoss AS7 的 SSL 中断连接(Richfaces 页面)

JBoss AS7中进行项目部署

如何配置 JBoss AS7.1.1 以引用 CORBA Remote-Bean

如何让 Jenkins 将我的项目部署到 JBoss EAP(AS7)