如何給非maven的javaweb項目霸王硬上弓

最近在公司搭建了一套代碼安全質量分析平臺--著名的SonarQube開源版本,再配合jenkins組成自動化流程。java

jenkins調用maven作源碼編譯打包,而後調用SonarQube進行代碼掃描,看起來一點問題都沒有。web

可是問題來了,公司的項目都是非maven結構的javaweb項目。apache

上網查了一下,非maven結構的javaweb項目經過更多的定製配置,是完成能夠用maven來編譯打包的。json


這兩天碰到公司一個javaweb項目,結構比較特殊,項目裏除了引用jar包,還引用了class文件,相似下面的結構安全

圖片描述

在網上查了半天,找不到這樣項目結構使用maven的相關實踐。運氣比較好的是,以前幫公司配置 pinpoint agent 的時候,剛好了解了一個jvm參數 -classpath,通過在家的一系列實驗,終於把這樣項目結構的工程編譯打包,pom的關鍵配置以下:jvm

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <verbose>true</verbose>
                    <showWarnings>true</showWarnings>

                    <compilerArgs>
                        <arg>-extdirs</arg>
                        <arg>WebContent/WEB-INF/lib</arg>
                        <arg>-classpath</arg>
                        <arg>ImportedClasses</arg>
                    </compilerArgs>

                </configuration>
            </plugin>

在<compilerArgs>裏設置編譯用的jvm參數,除了常規引用的放在WebContent/WEB-INF/lib裏的全部jar包,還有ImportedClasses目錄下的
全部class文件。maven

這樣就能夠完美的進行編譯和打包了。spa


回到公司配置好,編譯,報錯。有一個類的一個方法找不到。code


這個項目還有一個特別之處,就是其中一個引用的class文件(且稱它爲a.class),跟其中一個jar包裏的class文件的包名、類名如出一轍,反編譯看,二者內容卻不同。blog

按照上面的配置方法,maven在調用javac編譯源碼,會按順序掃描依賴的文件,直到碰到第一個目標。

看下圖,maven會從這個搜索路徑裏,按順序去找依賴的類,請注意這裏的排序:

  1. 先是jdk
  2. 而後到lib裏的jar
  3. 最後到-classpath 指定的 ImportedClasses

clipboard.png


回到那個報錯,由於源碼裏引用的是 ImportedClasses 裏的 a.class 纔有的方法,而非 jar 裏的a.class,當maven在掃描依賴文件時,首先會碰到 jar 裏的 a.class,而後發現這個類沒有這個方法,因而報錯。


好了,說到這裏,解決思路呼之欲出,就是讓 ImportedClasses 的順序比 lib 靠前。

這個方案網上找了一通,多是由於拙略的搜索技巧,找不到別人提供的經驗。

本身各類嘗試,暫時也沒有找到能調整順序的方法。


捨棄javac 的-extdirs參數,所有依賴寫到-classpath裏,就能夠本身掌控依賴的搜索順序了。

<compilerArgs>
                        <arg>-classpath</arg>
                        <arg>ImportedClasses;WebContent/WEB-INF/lib/fastjson-1.2.47.jar</arg>
                    </compilerArgs>

clipboard.png

把ImportedClasses寫在全部jar以前,編擇成功。

這個方法的缺點就是,當以來的jar包不少的時候,這個值就變得很長,由於要把每個jar的路徑寫上去。


碰到這樣的項目結構機率通常比較小,因此這也算是一個maven的冷門使用了。遺憾的是網上彷佛找不到關於這種狀況的解決方案,特地註冊一個博客,以受批判。

相關文章
相關標籤/搜索