TL;DR——如何在运行时为任务提供ws_ant.sh
更多<wsInstallApp>
堆?
我正在尝试将一个相对较大(~160 MB)的 EAR 文件部署到在 64 位 Linux 平台上运行的 WebSphere 8.5。
这是我的任务build.xml
:
<wsInstallApp
ear="/my/ear/file/location/New.EAR"
properties="jvm.properties"
options="-appname myNewEarApp -update -deployws"
host="localhost"
conntype="SOAP"
user="the_username"
password="not_telling_you"
failonerror="true" />
使用与 WAS 一起打包执行它将ws_ant.sh
导致OutOfMemoryError
堆转储。
因此,我需要在运行时增加任务(或 ws_ant 本身?)可用的堆,但我不知道该在哪里做。我试过修改 wsadmin.sh,虽然如果我直接使用 Jython 脚本运行我的部署会产生影响wsadmin.sh
,但它似乎对<wsInstallApp>
Ant 脚本内部的执行没有任何影响。
这特性属性是可选的,它包含一个 Java 属性文件,其中包含要在 JVM 系统属性中设置的属性
在我的jvm.properties
文件中,我尝试过:
[user@localhost]$ cat jvm.properties
-Xms4096m
-Xmx4096m
这没有效果。ws_ant.sh
使用-v
详细标志执行显示,在某处,-Xmx 值设置为-Xmx256m
。我尝试了其他几种愚蠢的组合和格式,但似乎没有任何效果。
我还尝试在ws_ant.sh
调用中添加参数:
[user@localhost]$ ws_ant.sh -Xms4096m -Xmx4096m -v -f build.xml was.deploy
...但这似乎也没什么作用。
我究竟做错了什么? 我承认,如果有必要,我可以通过重新编写部署wsadmin.sh
并使用 Jython 脚本来满足我的要求,但我正在尝试利用来自不同 EAR 应用程序的一些广泛的 Ant 脚本。
备择方案?我也认识到我可以使用<wsadmin>
Ant 任务从 Ant 内部调用一些 Jython 脚本——我还没有尝试过——但是,我们已经有一些广泛的脚本了。 相对于另一种方式,这种方式的相对优势和劣势分别是什么?(即通过或相对于[及其“ws_____”兄弟]执行wsadmin.sh
/Jython 脚本)。<[ssh]exec>
<wsadmin>
<wsInstallApp>
答案1
尝试属性 jvmMaxMemory
<wsInstallApp
ear="/my/ear/file/location/New.EAR"
jvmMaxMemory="1024M"
options="-appname myNewEarApp -update -deployws"
host="localhost"
conntype="SOAP"
user="the_username"
password="not_telling_you"
failonerror="true" />
答案2
对于 ws_ant.sh,你必须使用JVM_EXTRA_CMD_ARGS环境变量。
export JVM_EXTRA_CMD_ARGS="-Xms1G -Xmx2G"
sh $WEBSPHERE_HOME/bin/ws_ant.sh -f was-build.xml
为了证明这一点,交换最小和最大尺寸“-Xms2G -Xmx1G”,您将收到错误:
VMJ9GC019E -Xms too large for -Xmx
JVMJ9VM015W Initialization error for library j9gc26(2): Failed to initialize
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
答案3
我们正在使用 Maven 进行部署,我可以确认,将 jvmMaxMemory 添加到 wsInstallApp 有帮助。我不得不分叉原始插件并添加对它的支持。