1.報錯現象
這兩天遇到一個Maven插件(JS壓縮)在公司Linux主機編譯出錯的問題,出錯內容如下:
[ERROR] Failed to execute goal net.alchim31.maven:yuicompressor-maven-plugin:1.5.0:compress (default) on project crm-web: Execution default of goal net.alchim31.maven:yuicompressor-maven-plugin:1.5.0:compress failed: A required class was missing while executing net.alchim31.maven:yuicompressor-maven-plugin:1.5.0:compress: org/mozilla/javascript/ErrorReporter
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>net.alchim31.maven:yuicompressor-maven-plugin:1.5.0
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/data/crm/crmweb/.m2/repository/net/alchim31/maven/yuicompressor-maven-plugin/1.5.0/yuicompressor-maven-plugin-1.5.0.jar
[ERROR] urls[1] = file:/data/crm/crmweb/.m2/repository/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar
[ERROR] Number of foreign imports: 1
[ERROR] import: Entry[import from realm ClassRealm[maven.api, parent: null]]
[ERROR]
[ERROR] -----------------------------------------------------: org.mozilla.javascript.ErrorReporter
2.使用場景
用此插件主要用於對JS進行壓縮,以提高用戶對系統的攻擊門檻,因此我在我們WEB工程的pom增加了如下配置:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.5.01</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>compress</goal>
</goals>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
<jswarn>false</jswarn>
<nosuffix>true</nosuffix>
<force>true</force>
<linebreakpos>-1</linebreakpos>
<sourceDirectory>WebRoot</sourceDirectory>
<outputDirectory>target/crm-web-3.0.0-SNAPSHOT</outputDirectory>
<includes>
<include>js/crmpub/compress/js/security_check.js</include>
</includes>
<excludes>
</excludes>
</configuration>
</plugin>
增加之後本地可以正常使用並可以達到預期效果,而在公司Linux服務器上確報第一節中的錯誤。
3.處理過程
由於公司主機是在內網網絡上不通,所以先將插件需要的一些第三方jar導入到了公司私服,各種導入之後,仍然不行;於是將插件源碼下載下來,發現有些JAR包衝突,然後很開心的把衝突都解決了,編譯打包到私服,仍然報錯;然後各種關鍵字百度,網上各種說法試過了都不行,後經過嘗試以下兩種方法確定可以解決:
4.可行方法
4.1.服務器安裝此插件
各種方法嘗後,把源碼放到公司主機上編譯安裝了一下,命令如下:
mvn clean package install -Dmaven.test.skip=true
再試了一下竟然編譯WEB項目成功,併成功壓縮了JS文件,有點喜出望外的感覺,必竟整整折騰了一個下午。不過原因真的沒法有搞明白,直到現在也沒有明白!
4.2.改插件引用配置
雖然上面的方法已經解決,但是心理還是不舒服,以後其它地方編譯,也需要將源碼拿到對應的主機上編譯一次,比較不便與繁鎖,於是繼續上其它網站找其它解決方法,終於在https://stackoverflow.com上找到了對應幫助。主要參考了以下兩啓遍文章:
https://stackoverflow.com/questions/6652550/yui-compressor-stringindexoutofboundsexception-on-jboss
最終的配置如下,紅色部分是相對之前增加的部分:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.5.01</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>compress</goal>
</goals>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
<jswarn>false</jswarn>
<nosuffix>true</nosuffix>
<force>true</force>
<linebreakpos>-1</linebreakpos>
<sourceDirectory>WebRoot</sourceDirectory>
<outputDirectory>target/crm-web-3.0.0-SNAPSHOT</outputDirectory>
<includes>
<include>js/crmpub/compress/js/security_check.js</include>
</includes>
<excludes>
</excludes>
</configuration>
<dependencies>
<dependency>
<groupId>org.sonatype.plexus</groupId>
<artifactId>plexus-build-api</artifactId>
<version>0.0.7</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.0.15</version>
</dependency>
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.7</version>
<exclusions>
<exclusion>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<scope>compile</scope>
<version>1.7R2</version>
</dependency>
</dependencies>
</plugin>
其最終原因是因爲多個rhino包造成的影響,因此,直接在插件將插件需要用到的包在其下面依賴進來,其實插件源碼pom已經有這些引用,但就是在主機上不行。另外,還有一點要注意rhino包需要yuicompress包之後。
5.遺留問題
爲什麼相同的配置本地可以,服務器主機上就是不行,待後續再研究!