Компрессор Yui StringIndexOutOfBoundsException на jboss

При сворачивании юи с 2.4.6 получаю вот такую ​​проблему:

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:

<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.6</version>
</dependency>

Есть ли способ решить эту проблему, используя исключения maven и т. д., или обновив мою версию YUI. Кажется глупым, что это просто не работает, и я не хочу писать собственный загрузчик классов.

Пожалуйста помоги!


person lukewm    schedule 11.07.2011    source источник
comment
У меня тоже есть эта проблема! Кровавый ад! Хотя у меня tomcat 6.   -  person egervari    schedule 08.12.2011
comment
Удалось перепаковать ОК? В конце концов я затолкал большую часть исходного кода Rhino в свой пакет. Возможно, я смогу сделать пакет доступным на github, если у вас есть пара дней?   -  person lukewm    schedule 05.01.2012
comment
Я сделал ту же переупаковку, я жду рабочего исправления от команды YUI, но я сомневаюсь, что оно будет исправлено, используя то, как они программируют ....   -  person Danubian Sailor    schedule 13.01.2012
comment
Я сообщил об ошибке: github.com/yui/yuicompressor/issues/161   -  person Timothy Kim    schedule 27.09.2014


Ответы (4)


Обходной путь: для 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.

Примечание: если у вас есть носорог в пути к классам каким-то другим способом, похоже, вы снова получите эту ошибку.

person Alexander Shagin    schedule 10.11.2012

Я решил эту проблему, самостоятельно переупаковав yuicompressor, включив в него большую часть исходного кода Rhino. См. мой ответ Говарду М. Льюису Шипу.

Перепакованный исходный код можно найти здесь: http://viscri.co.uk/labs/tapestry/yuicompressor-rhino-bugfix-5.0.jar. Просто добавьте это в свой помпон:

<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

Вам также необходимо исключить версию 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>

Это должно работать.

person lukewm    schedule 01.08.2011
comment
Да, эти чистые маленькие муравьиные создания полностью основаны на последовательности библиотек в загрузчике классов, который настолько плох, что я до сих пор едва могу дышать, когда его пишу бррр! У них это работает, потому что они используют муравей, на сервере приложений все наоборот. Я сделал упаковку, которую вы описали, и она работает как надо. - person Danubian Sailor; 13.01.2012

Баночка выбранного ответа (по состоянию на 26.09.2014) больше не существует.

Итак, я создал ответвление yuicompressor, в котором весь пакет rhino встроен в пакет yuicompressor и помещен в пространство имен yui.

https://github.com/timothykim/yuicompressor

Просто клонируйте репозиторий и запустите ant, чтобы получить банку.

Надеюсь, это поможет любому, кто столкнется с этой проблемой.

person Timothy Kim    schedule 26.09.2014

У вас действительно проблемы с загрузчиком классов в JBoss?

Вам придется сделать какое-то исключение для конкурирующего JAR-файла Rhino. Почему Rhino находится на пути к классам? Это может быть дополнительная функция JBoss, которую вы можете отключить и таким образом избежать конфликта.

person Howard M. Lewis Ship    schedule 12.07.2011
comment
Rhino находится на пути к классам, потому что от него зависит упакованный maven yuicompressor. В основном yui перезаписывает пару классов носорогов, но не все из них, что приводит либо к исключениям classNotFound, если rhino исключен, либо к проблеме выше, если это не так. Я собирался отправить письмо по этому поводу в список рассылки гобелена, так как думал, что использование yui в гобелене 5.3 приведет к тем же проблемам. В конце концов, я просто смешал носорога и Юи в своей собственной банке. - person lukewm; 13.07.2011
comment
Они описывают проблему здесь: yuilibrary.com/projects/yuicompressor/ticket/2528114. Говорят, это решаемо, но я сомневаюсь, учитывая то, как это написано. В исходном пакете, загруженном сегодня, по крайней мере, ничего по этому поводу не сделано. - person Danubian Sailor; 13.01.2012