Maven打包GeoTools後坐標轉換錯誤的問題
阿新 • • 發佈:2022-01-02
使用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"/>