0

让有一个(Liferay hook 插件)eclipse 项目 xyz-hook。并让文件 a.jsp

<% @include file="/html/portal/init.jsp" %>
<% InitImportedClass.yxz(); %>

并在另一个(引用的)项目中包含包含的 init.jsp。

<% @page import="de.company.InitImportedClass" %>

对于项目 xyz-hook 中的 a.jsp,我们在第 1 行收到警告

Fragment "/html/portal/init.jsp" was not found at expected path /xyz-hook/src/main/webapp/html/portal/init.jsp

和第 2 行的错误

InitImportedClass cannot be resolved

有什么方法可以告诉 Eclipse 在另一个项目中寻找 init.jsp 吗?

包含 init.jsp 的项目(Liferay 门户主干)已被引用。我还创建了一个包含 jsp 的合成 jar,将其添加到本地 maven 存储库并作为项目 xyz-hook 的依赖项。

PS:对于那些想知道的人,这是 Liferay 钩子在替换 jsps 时的典型设置,由门户核心提供。

PPS:我知道我可以完全停用 jsp 验证,但这是我想避免的,因为否则真正丢失的导入也不会显示为错误。

4

1 回答 1

1

我非常欢迎这样的功能,但根据我上次关于它的对话,它真的很难解决,并且需要对相当多的组件进行重大更改。鉴于 jsp 编辑器已经有些脆弱(有时它会显示不存在的验证错误),我认为在不久的将来不会有人攻击它。但我会以此为理由再次唠叨。(您可能想在https://issues.liferay.com/browse/IDE上发布功能请求或找到现有的并支持它)

但是,有一些解决方法:

使用<liferay-util:include />jsp-tag 您可以指定一个 servletContext 并从您自己的钩子中包含另一个 JSP。这将在指定的 webapp 的类加载器中运行,并且 eclipse 可以很好地处理那个。在您的 jsp-hook 中,您仍然需要停用 jsp 验证,但剩余的 JSP 只是执行包含业务的几个字符,这很好。

您将需要更多的工作来获取所有上下文等,但如果您正在做一些更繁重的工作,这可能是一个选择。您还可以使用来自钩子的自定义类 - 当您将新的 jsp 引入门户类加载器时通常不能这样做。

伪代码示例:

在您的钩子中,从门户覆盖 jsps,例如在my-hook/custom-jsps/html/portlet/navigation/view.jsp

   <%-- omitted taglib includes --%>
   <liferay-util:include 
         page="/jsp/navigation/view.jsp" 
         servletContext="<%=this.getServletContext().getContext("/my-hook")%>" />

这将用您自己的实现覆盖 Liferay 的导航 portlet 的默认 jsp。但是,它显然并没有做太多,而是包含/jsp/navigation/view.jsp它将在您自己的钩子中找到的内容(注意:/custom-jsps包含覆盖门户的 jsps - 文件/jsp将在钩子的上下文中提供:

my-hook/jsp/navigation/view.jsp

   <%-- omitted taglib includes --%> 
   <ul>
   <li>build</li><li>your</li><li>navigation</li>
   </ul>
   <!-- you also have access to classes introduced by your hook -->
   <%=CustomClassInHook.doSomething() %>     

缺点是您必须“重复”每个 Liferay jsp 通常自行获取的初始化 - 例如导入语句、使 themeDisplay 可用等。

另外,请注意:以上是伪代码。我只是从一些(笔和纸)笔记中在这里输入的,而不是运行它。所以它可能需要更多的工作并且有其他缺点或缺点。


另一种可能性是在 Liferay 的源代码中开发复杂的覆盖 jsps,并在完成后将它们带到您自己的钩子中。如果您需要重建 Liferay(但谁为 jsp 更改而重建?),您将在构建时受到打击,但您获得了所有 IDE 的奢华

于 2014-02-13T05:36:04.177 回答