让我们有一个(Liferay钩子插件)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:对于那些想知道的人来说,这是替换jsps时Liferay钩子的典型设置,这是由门户核心提供的。
PPS:我知道我可以完全取消激活jsp验证,但这是我想避免的,因为否则真正缺失的导入也不会显示为错误。
答案 0 :(得分: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通常自己进行的初始化 - 例如import语句,make themeDisplay等。
另外,请注意:上面是伪代码。我只是从一些(笔和纸)笔记输入它,而不是运行它。所以它可能需要更多的工作,并有其他缺点或缺点。
另一种可能性是在Liferay的源代码中开发复杂的重写jsps,并且 - 完成后 - 将它们带到你自己的钩子中。如果你需要重建Liferay(但是重建jsp更改?)你会得到一个构建时间命中,但你获得了所有IDE的奢侈