我一直在使用ant脚本来构建使用jwsc任务的Web服务ear文件。在一个for循环中构建太多war文件时,遇到以下错误。
C:\ Work \ build.xml:193:java.lang.OutOfMemoryError:PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at org.apache.tools.ant.AntClassLoader.defineClassFromData(AntClassLoader.java:1136) 在org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.java:1307) 在org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1362) 在org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1323) 在org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1076) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 在weblogic.utils.classloaders.FilteringClassLoader.findClass(FilteringClassLoader.java:101) at weblogic.wsee.util.JAXWSClassLoaderFactory $ 1.findClass(JAXWSClassLoaderFactory.java:52) 在weblogic.utils.classloaders.FilteringClassLoader.loadClass(FilteringClassLoader.java:86) at java.lang.ClassLoader.loadClass(ClassLoader.java:412) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 在weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179) at java.lang.Class.forName0(Native Method) 在java.lang.Class.forName(Class.java:270) at weblogic.descriptor.internal.DescriptorImpl.createRootBean(DescriptorImpl.java:386) at weblogic.descriptor.BasicDescriptorManager.createDescriptorRoot(BasicDescriptorManager.java:396) 在weblogic.wsee.tools.jws.war.WebAppProcessor.getWebAppBean(WebAppProcessor.java:98) 在weblogic.wsee.tools.jws.war.WebAppProcessor.process(WebAppProcessor.java:47) 在weblogic.wsee.tools.jws.process.CompositeProcessor.process(CompositeProcessor.java:47) 在weblogic.wsee.tools.jws.build.JwsCompiler.buildWebServices(JwsCompiler.java:532) 在weblogic.wsee.tools.jws.build.JwsCompiler.compile(JwsCompiler.java:493) 在weblogic.wsee.tools.anttasks.JwsModule.generate(JwsModule.java:379) 在weblogic.wsee.tools.anttasks.JwsModule.build(JwsModule.java:256) 在weblogic.wsee.tools.anttasks.JwscTask.execute(JwscTask.java:184) 在org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor4.invoke(未知来源) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) 在org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在org.apache.tools.ant.Task.perform(Task.java:348)
根据某些网站上的建议,我在任务中使用了fork设置以及memoryinitialsize和memorymaximumsize。但我仍然遇到错误,因为jwsc没有考虑fork选项。构建5个war文件后,循环才会失败。从上一个循环输出,我可以从cmd抓取这个片段。
[jwsc] Parsing source files
[jwsc] Parsing source files
[jwsc] 1 JWS files being processed for module TESTService
[jwsc] JWS: C:\Work\Build\WEB-INF\classes\TESTServiceImpl.java Validated.
[jwsc] Processing 1 JAX-WS web services...
[jwsc] Since compiler setting isn't classic or modern, ignoring fork setting.
[jwsc] Compiling 1 source file to C:\Users\pmraju\AppData\Local\Temp\_h40kgy
[jwsc] Since compiler setting isn't classic or modern, ignoring fork setting.
这是我使用jwsc
的蚂蚁示例代码 <taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask">
<classpath refid="classpath"/>
</taskdef>
<jwsc fork="yes" compiler="modern" srcdir="${destdir}/Build/WEB-INF/classes" destdir="${destdir}/Build" memoryinitialsize="1024m" memorymaximumsize="2048m" optimize="on" includeantruntime="false">
<module contextpath="/${service}" name="${service}" explode="false">
<jws file="${service}Impl.java" compiledwsdl="${destdir}/Build/${service}.jar" type="JAXWS" />
</module>
<classpath refid="classpath"/>
</jwsc>
从上面可以看出,即使我提供 fork 和编译器属性,jwsc输出状态 [jwsc]因为编译器设置不是&#39 ;经典或现代,忽略前叉设置。
任何帮助都将不胜感激。
编辑:
通过在调用ant之前在cmd中运行命令set ANT_OPTS=-Xms256m -Xmx1024m -XX:MaxPermSize=1024m
,可以在没有 java.lang.OutOfMemoryError:PermGen 错误的情况下继续执行。我仍然无法理解为什么在jwsc任务中不考虑编译器设置,希望有人会想。