マルチプロジェクトのGradleビルド構造があり、子プロジェクトがJARに依存しているため、WARファイルに含めたくありません。 「除外」を試みましたが、機能しません。
メインプロジェクトスクリプト:
apply plugin: 'war'
war {
dependencies {
runtime (project(':childProject')) {
exclude group: 'javax.servlet.jsp', module: 'jsp-api'
}
}
}
ChildProjectスクリプト:
apply plugin: 'Java'
dependencies {
compile 'javax.servlet.jsp:jsp-api'
}
Gradleのドキュメントから
Warプラグインは、providedCompileとprovidedRuntimeの2つの依存関係設定を追加します。これらの構成のスコープは、WARアーカイブに追加されないことを除いて、それぞれのコンパイル構成およびランタイム構成と同じです。
したがって、言い換えると、providedCompile
またはprovidedRuntime
にエントリを追加すると、その依存関係がwarファイルから除外されます。
providedCompile
を使用しますprovidedRuntime
を使用します。http://www.gradle.org/docs/current/userguide/war_plugin.html
例
providedCompile "javax.servlet:servlet-api:2.5"
私はそれをこのようにしています。
war {
rootSpec.exclude("**/some-*.jar")
}
私は、providedCompileが依存関係の問題を引き起こすことがあることに気付きました。一部のクラスが見つかりません。次に、より柔軟なソリューションを見つけました。
次のwar構成を使用して、必要な依存関係を「コンパイル」として構成し、特定のjarをwarファイルから除外できます。
war {
classpath = classpath.filter { file ->
println file.name
(
!file.name.startsWith('gwt-dev') &&
!file.name.startsWith('gwt-user') &&
!file.name.startsWith('guava-gwt') &&
!file.name.startsWith('gwtbootstrap3') &&
!file.name.startsWith('gwtbootstrap3-extras') &&
!file.name.startsWith('servlet-api')
)
}
}
これまでのところ、これが私にとって最もクリーンなソリューションであることがわかりました。お役に立てば幸いです。
私は同じ問題を抱えていましたが、Jake Wのものに基づいた一般的な解決策を見つけました。
子プロジェクトで、warプラグインを使用せずに、次のように独自のprovidedCompileとprovidedRuntimeを追加します。
configurations {
providedCompile
providedRuntime.extendsFrom providedCompile
}
plugins.withId('Java') {
configurations {
compile.extendsFrom providedCompile
runtime.extendsFrom providedRuntime
}
}
Warファイルを含むプロジェクトで、これを好きな場所にコピーします。
configurations.runtime.allDependencies.withType(ProjectDependency) { ProjectDependency dep ->
Project proj = dep.dependencyProject
evaluationDependsOn(proj.path)
Configuration cfg = proj.configurations.findByName('providedRuntime')
if (cfg != null){
war {
classpath -= cfg
}
}
}