1. 程式人生 > 其它 >Maven打包GeoTools後坐標轉換錯誤的問題

Maven打包GeoTools後坐標轉換錯誤的問題

使用Maven打包Geotools的坑

1.描述

java.util.ServiceLoader:是一種動態發現實現類的工具。

2.條件

1. 檔案必須放在classpath*:META-INF/services/下
2. 檔名稱必須是介面(類)的全限定名稱(包名+類名)

3.原理

ServiceLoader通過ClassLoader去載入檔案的類,本質就是通過ClassLoader白嫖。

1. ServiceLoader查詢classpath*:META-INF/services/下的所有相同全限定類名的檔案
2. ServiceLoader獲取第一步拿到的檔案並按行解析出檔案中的類名,然後通過ClassLoader載入類。
3. 最後可以通過遍歷呼叫介面的實現方法

4.例項

   Las轉Pnts的過程中,將cesium-point-cloud-generator改成Maven專案以後,使用maven-shade-plugin打包。在增加SRID引數之後,發現打出來的包能正常執行,但是轉出來的座標全是錯的,在經過一頓排查之後發現了這段神奇的程式碼,如下圖:

   通過上圖發現,Maven打包後,程式會去classpath*:META-INF/services資料夾下查org.opengis.referencing.crs.CRSAuthorityFactory的同名檔案來獲取實現類,由於maven-shade-plugin打包中未使用<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

導致重名的直接選擇了一份,其他全部同名檔案丟失,而不是合併,所以導致在轉換的過程中沒有找到維精高的實現,但是又有實現,所以在沒有報錯的情況下轉出了錯誤的座標。