背景知识:Java 6提供对执行脚本语言的支持,这个支持来自于JSR223规范,对应的包是javax.script。默认情况下,Java 6只支持JavaScript脚本,它底层的实现是Mozilla Rhino,它是个纯Java的JavaScript实现。
详见: http://developer.51cto.com/art/201007/208812.htm
昨天运行ant脚本时触发了macros.js里这样一个js error: Uncaught TypeError: Cannot call method 'join' of undefined.
根据错误的line位置, 我查看了这个js
function concat(parts) {
return parts.join('/');
}
很难看出来为什么红色这一行会有问题, 但以前没什么没发生呢. 什么地方的改动触发了这个error呢, 我今天的改动只不过是想把下面SilverFabricSDK和DSServer的version和location由4.1.0改为5.0.1, 就这么一个细小的改动跟上面的js有哪门子关系? 看上面js报错的地方实在是没头绪.
<target name="init">
<init />
<require name="sf-common" when="compile-and-runtime" type="jar"
version="${common_rel_ver}" build-number="${common_build_num}" location="${common.gridlib.dir}"/>
<require name="commons-io" when="compile-and-runtime" type="plain-jar"
version="2.0" location="${basedir}/../../common/lib/thirdparty"/>
<require name="json" when="runtime" type="plain-jar"
version="20080701" location="${basedir}/../../common/lib/thirdparty"/>
<require name="SilverFabricSDK" when="compile" type="plain-jar"
version="5.0.1" location="${basedir}/../../common/lib/sf/5.0.1"/>
<require name="DSServer" when="test" type="plain-jar"
version="4.1.0" location="${basedir}/../../common/lib/sf/4.1.0"/>
...
...
...
于是在js中打印一下parts试试看, 到底是个什么东西.
function concat(parts) {
java.lang.System.out.println("**" + parts.toString());
return parts.join('/');
}
在没错误情况下打印会看得更清楚, 于是先把版本号改回4.1.0, 打印的结果显示原来是把location下的jar文件和版本号拼在一起, 拼成${basedir}/../../common/lib/sf/4.1.0/SilverFabricSDK-4.1.0.jar, 如果location下有这个文件就ok, 没有就会出现上面的error. 于是我又去${basedir}/../../common/lib/sf/5.0.1的下面, 发现SilverFabricSDK.jar这个jar原来不含版本号, 换句话说, 跟没本有${basedir}/../../common/lib/sf/5.0.1/SilverFabricSDK-5.0.1.jar
其实真正引起错误原因的位置并不是显示错误的哪一个行, 而是在下面这一个行时, 传入的参数就已经出问题了:
add_element(path, filename, true);
由于上面找的${basedir}/../../common/lib/sf/5.0.1/SilverFabricSDK-5.0.1.jar不存在, 所以parts实际的类型是不是期望的字符串数组, 而是布尔类型, 因为
JavaScript 拥有动态类型,换句话说,相同的变量可用作不同的类型. 布尔类型自然没有数组的join()这个方法, 所以报Cannot call method 'join' of undefined.
function add_element(path, parts, required) {
file = new File(concat(parts));
if (required) {
file.exists() || self.fail('File [' + file.getAbsolutePath() + '] does`t not exist');
element = path.createPathElement();
element.setLocation(file);
} else {
if (file.exists()) {
element = path.createPathElement();
element.setLocation(file);
}
}
}
filename = exists([location, name + '-' + relVer + '.jar']) || exists([location, name + '_' + relVer + '.jar']);
add_element(path, filename, true);
最后还有一点补充, 如果这样打印
function concat(parts) {
java.lang.System.out.println(parts);
return parts.join('/');
}
会遇到这样的Exception,
D:\cloudteam\SFAMX\bpm-server\container\build.xml:16: javax.script.ScriptExcepti
on: sun.org.mozilla.javascript.internal.EvaluatorException: Cannot convert sun.o
rg.mozilla.javascript.internal.NativeArray@7a1576 to char[] (<Unknown source>#13
9) in <Unknown source> at line number 139
其实本质上还是js类型的问题, 由于parts不出错情况下是js的字符串数组类型, 而java.lang.System.out.println()的参数是java的char[]类型, 这两个类型没法直接直接转化, 所以必须把parts.toString()或者用"+"连接一个字符串类型, 即java.lang.System.out.println("**"+parts); 这样parts才能从js数组类型转化成字符串类型, 供java.lang.System.out.println()使用.
PS:jdk6有一个命令行工具:jrunscript
cd到jire的bin目录,默认为javascript语言,可以直接输入单行js脚本测试语法是否正确, 观察输出
分享到:
相关推荐
在Firefox下还有firebug,这的确是一个不错的js调试工具,但在IE下使用就很麻 烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到...
这的确是一个不错的js调试工具,但在IE下使用就很麻 烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工 具,不敢私藏...
如果已有JavaScript基础,可以考虑深入学习一个框架如React或Vue.js;如果想要提升CSS编写效率,Sass和Less都是好选择;对于项目构建,Webpack适合大型项目,而Parcel适合快速开发。无论你选择哪一项,确保投入足够...
网站的自定义JavaScript 在任何网站上运行自定义JavaScript。 使用此工具可以在任何网站中注入自定义JavaScript。... 现在只有一个功能: customjsReady customjsReady ( '.nav' , function ( element ) {
之前答复你们一个月能下来的真是不好意思,没想到比想象的复杂、文件众多,一始既往完美高仿、纯净、无插件、无乱码;谢谢你们,希望你们使用愉快! 2345简介:2345网址导航目前用户超过3000万。截止到2011年8月...
- 可以观察到,传给eval的参数是一个加密后的字符串,通过一系列的转换最终解析成一个可执行的JavaScript函数体。 - 此过程涉及到了字符串的处理、正则表达式的应用、以及通过替换过程解码出可执行代码的逻辑。 4...
这的确是一个不错的js调试工具,但在IE下使用就很麻烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工具,不敢私藏,...
在Vue.js中,当涉及到页面加载完成后执行一个特定方法时,通常有几种常见的处理方式。本文将详细讨论这个问题,提供两种解决策略,并通过具体的代码示例进行解释。 首先,我们可能会想到在`mounted`或`created`生命...
Atom 是一个由 GitHub 开发的免费、开源的文本编辑器,它利用了现代 Web 技术如 HTML、CSS 和 JavaScript,使其具有高度可定制性和扩展性。这款配色方案的开发者Charlie Wilco将 Ganymede 的神秘色彩融入到 Atom 的...
- **JSBeautify**:一个轻量级的在线工具,可以快速地对JavaScript代码进行美化。 3. **使用方式** - **命令行接口 (CLI)**:大多数格式化工具都提供了命令行工具,可以集成到构建流程中,如`prettier --write .`...
标题“javascript-whatever”可能暗示这是一个个人项目或者集合,包含作者关于JavaScript的各种想法和实验。这种类型的项目通常会包括各种示例代码、技巧、最佳实践或对JavaScript特性的独特见解。 描述中的“无论...
-修正了IE下Grid中的一个JS问题(feedback:lqm4108)。 -修正Alert消息中引号未编码导致的JS错误(feedback:sun1299shine)。 +集成extjs3.0.3。 -修正弹出对话框的宽度计算错误(会保持最小的状态)。 -增加新的...
2.2. 让我们搞一个grid出来耍耍吧。 2.3. 上边那个是1.x的,2.0稍微有些不同哦 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. 让grid支持按列排序 2.5. 让单元格里显示红色的字,图片,...
这的确是一个不错的js调试工具,但在IE下使用就很麻烦,而且效果很不好,鄙人一直苦于寻找一个很好的IE下的js调试工具,能够自动捕获错误,并定位位置和原因,没想到今天竟在无意中寻找到了这么个好工具,不敢私藏,...
2.2. 让我们搞一个grid出来耍耍吧。 2.3. grid默认自带的功能 2.4. 按顺序,咱们先要把常见功能讲到 2.4.1. 自主决定每列的宽度 2.4.2. 让grid支持按列排序 2.4.3. 中文排序是个大问题 2.5. 让单元格里显示红色的字...
当时写的时候里面还有一处错误,Square.js中44行应该是*6,当时改六种类型少改了一个随机数,因为年代久远就没敢再改动,还有几行注释没有详细比如六种类型而不是五种,还有数字代表的具体类型少了两个注释,但是不影响...
-修正了IE下Grid中的一个JS问题(feedback:lqm4108)。 -修正Alert消息中引号未编码导致的JS错误(feedback:sun1299shine)。 +集成extjs3.0.3。 -修正弹出对话框的宽度计算错误(会保持最小的状态)。 -增加新的...
ECharts是百度开发的一个开源JavaScript库,提供了丰富的图表类型和交互功能,非常适合在网页中展示数据。在Winform应用中集成ECharts,可以通过嵌入WebBrowser控件来实现,让桌面应用也能享受到Web图表的优势。 本...
在提到“zookeeper”时,我们可能想到的是Apache ZooKeeper,这是一个分布式协调服务,用于管理大量的分布式系统。尽管WebDNN自身并不直接依赖ZooKeeper,但在大型分布式系统中,ZooKeeper可以用来管理WebDNN服务的...
首先想到的是检查控制台以检查最明显的错误。 控制台说initMap模块被错误地导入。 发生原因语法错误。 导入initMap模块时,其名称周围没有花括号。 尽管可以导入模块,但是只有在默认情况下从其导入文件的模块中...