我正在开发一个 Liferay 应用程序,由 2 个不同的 portlet 组成,两者都必须进行某些共同的操作,所以我决定将这些操作放在外部 Utils 类的静态方法中。
我必须将该类外部化以避免在两个 portlet 中重复相同的代码,并且我希望将 portlet 放在不同的 WAR 文件中。
我知道我可以将 Utils 类打包到 JAR 文件中,但我们仍在开发中,我们不想为每次更改重新生成 JAR 并重新启动 Tomcat。
哪个是最好的选择,我该如何执行?
如果您使用 Liferay SDK,您可以使用clients
(最近更改为shared
)目录来放置您的公共代码。
一个很好的例子是deploy-listener-shared如何与deploy-listener-hook结合使用。
从它的外观来看,您需要做的所有配置就是修改build.xml
将使用客户端\共享类的文件。如果您查看 deploy-listener-hook 的构建文件,您可以看到所有您需要添加的是。
对于新的 SDK:
<property name="import.shared" value="my-utils-shared" />
对于旧版 SDK:
<property name="dependent.clients" value="my-utils-client" />
希望这可以帮助!
还有另一种方法涉及构建 JAR 文件,但它不需要重新启动服务器(至少在 Tomcat 上)。
为您的 JAR 文件编写一个构建脚本,以便编译、构建 JAR 并最终将其复制到以下位置:
{tomcat}/webapps/ROOT/WEB-INF/lib
然后将您的 JAR 的名称添加到此文件中的“portal-dependency-jars”列表中,以便在它想要的源中(或者只需点击 GUI 中的“添加”按钮并选择所需的 JAR):
portal-dependency-jars=my-custom-lib.jar,my-other-custom-lib.jar
保存文件,然后重新部署 portlet,JAR 将在 portlet 部署时被复制。
我已经将此方法用于自定义 JAR 和需要在我的 portlet 中使用的第 3 方 JAR。
此外,您可能在一个 .war 中拥有多个 portlet。您可以只在portlet.xml
.
对于开发阶段,只需将 jar 文件与两个应用程序一起打包。
除非一个应用程序以某种方式依赖于另一个应用程序,否则它是完全可以的。
另一种解决方案是使用 JRebel 工具。它将允许您在不重新启动的情况下在 tomcat 中重新部署 jar。