Arquillian 中的 OutOfMemoryError

OutOfMemoryError in Arquillian

我想使用 Arquillian 部署一个大约 70MB 的 EAR,但无论我做什么,我得到:

Exception in thread "management-client-thread 1-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
at org.jboss.as.protocol.StreamUtils.copyStream(StreamUtils.java:52)
at org.jboss.as.controller.client.impl.InputStreamEntry$InMemoryEntry.initialize(InputStreamEntry.java:76)
at org.jboss.as.controller.client.impl.AbstractModelControllerClient$ReadAttachmentInputStreamRequestHandler.execute(AbstractModelControllerClient.java:193)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler.doExecute(AbstractMessageHandler.java:283)
at org.jboss.as.protocol.mgmt.AbstractMessageHandler$AsyncTaskRunner.run(AbstractMessageHandler.java:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:122)

我试过了:

EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(Maven.resolver().loadPomFromFile("pom.xml")
        .resolve("org.acme:module1:war:?","org.acme:module2","org.acme:module3:war:?")
        .withoutTransitivity().asFile());

然后

EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));

然后

EnterpriseArchive ear = ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File(
        "../org.acme.project.ear/target/org.acme.project.ear.ear"));

连 Google 都不知道 (java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich) 的异常,所以我补充说:

ear.delete("/module1-4.4.2.war");
// AND / OR
ear.delete("/module3-3.7.war");

哪个(取决于我删除的模块)将我带回到 OutOfMemoryError 或异常,因为当然现在的 application.xml EAR 不适用于新模块列表(并且由于 application.xml 是由 Maven 动态创建的,现在我可以将修改后的文件放入我的 Arquillian 测试工具中) .

然后我在 arquillian.xml:

中修改了 XmsXmx 属性
<container qualifier="jboss" default="true">
    <configuration>
        <property name="javaVmArguments">-Xms512m -Xmx1024m</property>
    </configuration>
</container>

问题的症结似乎是这个50MB WAR,我觉得没有那么大,但显然是。我该怎么做才能让我的 EAR 正常工作?

关于错误 java.lang.UnsupportedOperationException: Multiple WebArchives found in org.acme.project.ear. Can not determine which to enrich:

Arquillian 必须向部署中添加一些库(使用 @Deployment(testable = false) 时除外)。

  • 如果 ear 不包含任何 Web 模块,它将添加一个包含所需库的新 test.war 并将从此上下文触发测试(如果使用 servlet 协议)。
  • 如果 ear 只包含一个 Web 模块,它将搭载这个并将所需的资源添加到该模块,并在该单个 Web 模块的上下文中执行测试。
  • 现在有了多个网络模块,Arquillian 不知道要使用哪个网络模块,也不会添加额外的模块。相反,在这种情况下,您必须将其中一个 Web 模块标记为 Testable Web 模块。

要将 module1 标记为可测试存档,您可以这样做:

EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class);
ear.addAsModules(
    org.jboss.arquillian.container.test.api.Testable.archiveToTest(
        ShrinkWrap.createFromZipFile(WebArchive.class, new File("lib/module1-4.4.2.war"));
ear.addAsModules(new File("lib/module2-3.7.0.jar"));
ear.addAsModules(new File("lib/module3-3.7.war"));

注意:事实上,如果 OOM 不会首先发生,您也应该在其他情况下看到此错误。

关于 OOM 我认为您应该增加测试进程的堆大小,arquillian.xml 中配置的堆大小将定义 JBoss 服务器的堆大小。 但是 OOM 甚至在应用程序部署之前就已经发生了。 如果您使用 Maven,这可能对您有所帮助: