#oracle #ant #weblogic #jython #wlst
#Oracle #ant #weblogic #jython #wlst
Вопрос:
Мне нужно логически и неинтерактивно отменить развертывание приложения из Oracle 10. Решение, которое я придумал, заключается в использовании WLST и написании программы на python, которая выполнит всю работу за меня. Проблема, с которой я сталкиваюсь, заключается в манипулировании sys.path
вне скрипта.
Я вызываю свой скрипт с помощью пользовательской WLSTTask
задачи Ant от Weblogic и передаю определенные аргументы в скрипт через arguments
атрибут. Это выглядит так:
<target name="undeploy-oldest">
<wlsttask
debug="true"
fileName="${basedir}/resources/script/py/undeployOldestApp.py"
arguments="dmi ${user} ${password} ${url} ${basedir}/resources/script/py/" />
</target>
И сам скрипт.
import sys
from apputil.applist import getAppList
from apputil.apputility import getOldestAppVersion
from wlstModule import connect, disconnect, undeploy
appName = sys.argv[1]
username = sys.argv[2]
password = sys.argv[3]
url = sys.argv[4]
connect(username, password, url)
serverAppList = getAppList()
versionToUndeploy = getOldestAppVersion(appName, serverAppList)
if (versionToUndeploy != -1):
undeploy(versionToUndeploy)
print "Undeployed " versionToUndeploy
else:
print "Nothing to undeploy"
disconnect()
Проблема, с которой я сталкиваюсь, связана с последним аргументом в списке аргументов задачи Ant. У меня создалось впечатление, что Jython добавляет текущий рабочий каталог в sys.path
автоматически; хотя, хотя я вижу запись для «.» в sys.path
, импорт из моего пользовательского apputil
модуля не работает. Я подозреваю, что это связано с тем, откуда на самом деле запускается Ant, и что «.» не представляет каталог, в котором undeployOldestApp.py
существует. Я попытался добавить путь к Ant classpath с помощью тега classpath внутри WLSTTask
тега, но он не добавил этот путь в sys.path
список Jython.
Мой единственный успех до сих пор был в этом последнем аргументе в задаче Ant, где между import sys
и from apputil.applist import getAppList
я вызываю sys.path.append(sys.argv[5])
. После этого на мои скрипты правильно ссылаются при импорте, и все в порядке. Я бы предпочел, чтобы я устранил эту зависимость и чтобы задача Ant обрабатывала внедрение нужного элемента path. Мне не повезло с этим.
Я надеюсь, что я выразился ясно, и что у сообщества появятся какие-то новые предложения или, по крайней мере, объяснения того, почему это, похоже, не работает. Спасибо.
Комментарии:
1. Я не пытаюсь ответить на ваш точный вопрос, но предлагаю сделать ваш скрипт надежным. Ваш скрипт может быть вызван из любого места и не обязательно из каталога, в котором он присутствует. Поэтому всегда полезно динамически определять местоположение вашего модуля в скрипте и добавлять sys.path. Например, если местоположение вашего модуля совпадает с местоположением скрипта (в вашем случае это.), то вам просто нужно определить местоположение скрипта и добавить к sys.path таким образом, вы также избежите параметра 5. Я знаю, что это старый пост, просто делюсь своими мыслями 🙂
Ответ №1:
Возможно, вы могли бы использовать параметр executeScriptBeforeFile=»true» и
<script>
sys.path.append(...)
</script>
В качестве альтернативы вы можете попробовать запустить задачу из java:
<java classname="weblogic.WLST" fork="true">
<arg line="${basedir}/resources/script/py/undeployOldestApp.py dmi ${user} ${password} ${url} ${basedir}/resources/script/py/"/>
<classpath refid="class.path"/>
</java>
Это может дать вам доступ к некоторым параметрам задачи Java, которые недоступны в задаче wlsttask.