Liferay 7.0 中的 Arcgis 冲突

Arcgis conflict in Liferay 7.0

我尝试在 Liferay 7.0 中使用 Arcgis javascript API 但失败了。我认为是因为 Liferay 7.0 使用 requireJS 来使用 javascript,这与 Arcgis javascript API 的 dojo 冲突。我正在使用此代码来实现 Arcgis API:

<script type="text/javascript" src="<%=request.getContextPath() %>/js/arcgis_js_api/library/3.14/3.14/init.js"></script>

<script>
require([
      "esri/map", "dojo/dom" 
    ], function(Map, dom) {

    var map = new esri.Map("map", {
        basemap: "topo",  //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wd
        center: [-122.45, 37.75], // longitude, latitude
        zoom: 13
      });
});

这是控制台日志:

java.lang.IllegalArgumentException: Path esri/map.js does not start with a "/" character
java.lang.IllegalArgumentException: Path dojo.js does not start with a "/" character

这是 javascript 错误:

Error: defineAlreadyDefined

谁有解决办法请帮帮我。谢谢!

正如您提到的 Liferay7 和您的脚本标记使用 <%=request.getContextPath()%>,您的 portlet 和 servlet 之间很可能不匹配 API:request 不知道任何portlet 上下文(但仍然存在,因为 JSP 是为 servlet 设计的,它是一个强制性的对象,激怒了很多人)

您自己的 Javascript 文件的 URL 与上下文根无关,但 Liferay 使它们在不同的路径上可用。最简单的方法是只提及您想要包含在 portlet 的配置中的文件,而不用弄乱这个位置。在 Liferay 7 OSGi portlet 模块中,它是这样工作的(伪代码,简化)

@Component(
    immediate = true,
    property = {
        "com.liferay.portlet.footer-portlet-javascript=/js/main.js",
        "javax.portlet.display-name=My Portlet",
    },
    service = Portlet.class
)

在 WAR 中打包的 JSR-286 portlet 中,您将使用 WEB-INF/liferay-portlet.xml.

中的 footer-portlet-javascript 值

或者,使用 header-* 变体。

我个人更喜欢这种方式,而不是记住资源路径是如何构建的。

我在实施 arcgis 之前使用此代码 (javascript):

if(typeof define !== "undefined" && typeof require !== "undefined"){
window.__define = window.define;
window.__require = window.require;
window.define = undefined;
window.require = undefined;}

会解决的