我的專案中有以下 build.gradle
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.oracle.database.jdbc:ojdbc11-production:21.3.0.0'
implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre8'
}
tasks.named('jar') {
setDuplicatesStrategy(DuplicatesStrategy.WARN)
manifest {
attributes 'Main-Class': 'com.example.App'
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
檔案META-INF/services/java.sql.Driver存在于兩個匯入的 jar 中。實際上,這個 Oracle JDBC 依賴項匯入了多個 jars,并且它們之間有更多沖突的檔案(具有不同的內容)(例如META-INF/native-image/native-image.properties和這個目錄中的其他檔案)。
當 DuplicatesStrategy 設定為 WARN 時,Oracle 驅動程式將覆寫 SQL Server JDBC 驅動程式的META-INF/services/java.sql.Driver. 這個(和其他)檔案被覆寫的后果是什么?
我應該如何處理這些重復檔案?有沒有辦法讓所有 jars 中的所有檔案?jar 的某些檔案被覆寫的可能性讓我感到不安。
沖突檔案是否常見?
uj5u.com熱心網友回復:
考慮不建立一個胖子。否則,您需要將META-INF/services/java.sql.Driver各種驅動程式合并到一個檔案中(自動或提供您自己的)。如果不合并,自動加載驅動程式將不適用于未包含服務定義檔案的驅動程式。如果您不能或不想合并(或提供您自己的版本),您將需要使用Class.forName. 另請參閱驅動程式類如何位于 JDBC4 中。
至于 to DuplicateStrategyuse,最好使用FAIL并明確排除檔案或位置,或者提出合并它們的策略,但這可能很麻煩。
至于其他檔案,我無法真正回答,但META-INF/native-image/*似乎與在 GraalVM 中使用該庫有關,因此除非您正在使用它,否則您可能可以安全地忽略該目錄中的檔案。
然而,如果這真的讓你擔心,或者你不知道檔案的作用,更好的選擇是不使用 fatjars(又名 uberjars),而是使用正確生成類路徑的部署方式(例如使用清單,或啟動器檔案)并將應用程式使用的各種庫分開。例如,請參閱使用 Gradle 在清單中添加類路徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311280.html
上一篇:從IntelliJIDEA中暫時殺死或重新啟動GradleDaemon?“gradle--stop”不起作用
下一篇:提供的javaHome似乎無效。我找不到java可執行檔案。試過的位置:C:\ProgramFiles\Java\jdk-17\bin\java.exe
