雖然我不使用Jenkins,但我確實使用了XMLAccess來解決它,但我的問題或多或少都是相同的。
基本上有用於Portlet應用自動部署三種方法:在EAR文件
- 包裝您的portlet WAR和通過部署管理器進行部署/ WAS。這就是所謂的「預先部署」,這就是詹金斯所做的。在放入EAR之後,必須使用XMLAccess完成部署,以便門戶知道EAR包含包含Portlet的Web應用程序。如果您已通過XMLAccess部署和註冊一次,則可以通過部署新的EAR文件繼續部署應用程序的更新。
- 使用WAR文件並通過門戶進行部署,與您通過GUI執行的方式類似;然後Portal將使用Deployment Manager/WAS來部署它。然後它將在WAS中生成應用程序名稱(PA_YourModule)。爲此,您需要將WAR文件上傳到服務器。
- Generate a PAA file。這包含WAR文件和XMLAccess文件。你需要啓動這個ConfigEngine。
在任何情況下,您都需要一個XMLAccess腳本來在門戶中註冊應用程序,這些腳本在方法上略有不同。在第一種方法你的XMLAccess腳本將引用EAR文件中的WAR,並在web-app標籤將有屬性predeployed="true"
:
<?xml version="1.0" encoding="UTF-8"?>
<request type="update" version="8.0.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_8.0.0.xsd">
<portal action="locate">
<web-app action="update" active="true" domain="rel" predeployed="true"
removable="true" uid="{id from portlet.xml}">
<url>file://localhost/$predeployed_root$/MyEARfile.ear/MyPortlets.war</url>
</portal>
</request>
在第二種方法您的XMLAccess腳本將這個樣子,你有把war文件中的目錄自己:
<?xml version="1.0" encoding="UTF-8"?>
<request type="update" version="8.0.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_8.0.0.xsd">
<portal action="locate">
<web-app action="update" active="true" domain="rel" uid="{id from portlet.xml}">
<url>file:////opt/WebSphere85/PortalServer/installableApps/MyPortlets.war</url>
</web-app>
</portal>
</request>
可以使用,可以在\PortalServer\doc\xml-samples
中發現的例子出口各類的XMLAccess腳本。
我採取了第二種方法,因爲我仍然想通過門戶GUI手動更新portlet應用程序,並且很多東西已經以這種方式部署。所以我在構建服務器上設置了XMLAccess。我複製描述here到構建服務器的JAR和我創建了一個的XMLAccess螞蟻宏(請注意,IBM文檔顯示不正確的JAR文件)運行的XMLAccess腳本:
<path id="XMLAccess.libraryclasspath">
<pathelement location="${WPS_80_DIR}/base/wp.xml.client/bin/wp.xml.client.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.base/shared/app/wp.base.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.engine.impl/shared/app/wp.engine.impl.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.utilities.streams/shared/app/wp.utilities.streams.jar"/>
<pathelement location="${WAS_80_DIR}/lib/j2ee.jar"/>
<pathelement location="${WAS_80_DIR}/lib/bootstrap.jar"/>
<pathelement location="${WAS_80_DIR}/java/jre/lib/ext/ibmjceprovider.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/com.ibm.ws.runtime.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/com.ibm.ws.emf.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/org.eclipse.emf.ecore.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/org.eclipse.emf.common.jar"/>
</path>
<macrodef name="xmlaccess">
<attribute name="script"/>
<sequential>
<java dir="${module}" classname="com.ibm.wps.xmlaccess.XmlAccess" logError="true">
<classpath refid="XMLAccess.libraryclasspath" />
<arg value="-user"/>
<arg value="wpsadmin"/>
<arg value="-url"/>
<arg value="http://portalhost:10040/wps/config"/>
<arg value="-password"/>
<arg value="passw0rd"/>
<arg value="-in"/>
<arg value="@{script}"/>
</java>
</sequential>
</macrodef>
然後我生成的WAR文件複製到一個的門戶網站節點使用SCP任務。只要它將部署管理器的連接設置正確,哪個節點並不重要。我建議在這裏使用SSH密鑰文件,當然,本地用戶需要獲得對服務器上installableApps
目錄的寫入訪問權限。
<scp file="mywars/portlet.war"
todir="[email protected]:/opt/WebSphere85/PortalServer/installableApps"
keyfile="${deployment.scp.key}"
passphrase="${deployment.scp.passphrase}" trust="true" />
對於每個應用程序我有使用部署的XMLAccess XML文件(或者,如果缺少它,我有一個XSLT的Ant任務生成一個使用portlet.xml中的portlet描述符飛)。您可以在XMLAccess腳本中爲portlet設置唯一的名稱,使它們更容易在您希望通過XMLAccess部署的頁面中引用,還可以設置首選項並部署同一portlet的多個實例(而不是必須在portlet描述符中執行此操作)。您還可以使用xml訪問任務來發布頁面和其他內容,例如將您的測試環境設置爲運行自動化集成測試的狀態。
的XML任務僅僅是這樣的:
<xmlaccess script="deploy-portlets.xml" />
然後門戶將通過把它在部署管理器做休息。我還從RAD運行這些Ant腳本並在我們的開發服務器上快速更新。
非常感謝羅伯爲廣泛和詳盡的專業答案。在複製了xmlaccess.bat文件中引用的所有jar之後,我還選擇了在構建服務器上運行xmlaccess的第二種方法。我也去爲每個portlet分離XML文件的方法,這樣我不必每次更新我剛剛調用的portlet使用我想要更新該portlet的XML文件編輯xml文件。我將使用ant腳本輸入要更新的portlet名稱,並調用這些portlet的相應xml。 –