[英]YUI Compressor throws StringIndexOutOfBoundsException when running in Tomcat from a WAR
[英]Yui compressor StringIndexOutOfBoundsException on jboss
当使用 2.4.6 最小化 yui 时,我遇到了这个问题:
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:232
at java.lang.String.substring(String.java:1934)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.printSourceString(JavaScriptCompressor.java:267)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:330)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.<init>(JavaScriptCompressor.java:533)
它在通过我的 IDE 启动时有效,但在部署到 jboss 时无效。 这个地方: http://yuilibrary.com/forum/viewtopic.php?p=20086对同样的问题进行了一些讨论。
显然,问题在于 org/mozilla/javascript/Parser 在从我的 maven 配置中提取的两个 jars 中:
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.6</version>
</dependency>
有什么办法可以使用 maven 排除等或升级我的 YUI 版本来解决这个问题。 它不起作用似乎很愚蠢,我不想编写自定义类加载器。
请帮忙!
解决方法:对于 JBoss AS 7.1.1.Final 和 YUICompressor 2.4.7
从依赖项中排除 rhino:
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>${yuicompressor.version}</version>
<exclusions>
<exclusion>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
</exclusion>
</exclusions>
</dependency>
为什么? 见https://github.com/greenlaw110/greenscript/pull/29#issuecomment-4017147
注意:如果您通过其他方式在类路径中有 rhino,那么您似乎会再次收到此错误。
我通过自己重新打包 yuicompressor 以包含大部分 rhino 源来解决了这个问题。 请参阅我对 Howard M. Lewis Ship 的回复。
重新打包的源代码可以在这里找到: http://viscri.co.uk/labs/tapestry/yuicompressor-rhino-bugfix-5.0.jar 。 只需将其添加到您的 pom 中:
<dependency>
<groupId>yuicompressorbugfix</groupId>
<artifactId>yuicompressor-rhino-bugfix</artifactId>
<version>5.0</version>
</dependency>
如果您不运行自己的 nexus 版本,则必须将其安装在要构建的机器上。 我认为这是您需要的命令: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
您还需要排除 Tapestry 引入的 yuicompressor 版本:
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-yuicompressor</artifactId>
<version>5.3.2</version>
<exclusions>
<exclusion>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
</exclusion>
</exclusions>
这应该有效。
所选答案(截至 2014 年 9 月 26 日)jar 不再存在。
因此,我创建了一个 yuicompressor 的分支,其中整个 rhino package 嵌入到 yuicompressor package 中,并将其命名为 yui。
https://github.com/timothykim/yuicompressor
只需克隆 repo 并运行ant
即可获得 jar。
希望这可以帮助其他遇到此问题的人。
真的,您在 JBoss 中遇到 class 加载程序问题?
您将不得不对竞争的 rhino JAR 文件进行某种排除。 为什么 Rhino 在类路径上? 它可能是 JBoss 的可选功能,您可以关闭并避免冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.