Springソース(Grade管理)からMaven項目に移行します。
39620 ワード
Springソース(Grade管理)からMaven項目に移行します。
背景:プロジェクトのソースコードは
一、mavenプラグインを追加する
まず
前述したように、buildディレクトリの下で
1、案1
三、Graadleを通じてJarを発表し、リモート中央倉庫に行く。
この間、Mavenプロジェクトを何回も試しましたが、失敗しました。Gradeは直接にmaven中央倉庫を使うことができると思いますが、それは直接にmaven倉庫にもアップロードできますか?検索には2つの方法があります。
1、
第一歩:配布する中央倉庫の住所/登録情報を設定する
次に、各ワード項目に下記のコードを追加します。以下の例は
前に述べた方法はサブプロジェクトのサブプロジェクトの構成を要求しています。面倒くさいし、通用しないです。以下に汎用的な構成を提供します。
ステップ2:アーティファクト属性の設定リリース
第1ステップは直接的に省略して、前のように直接第2ステップに進み、subprojectを使って構成します。
3、
前述した方法はpom.xmlを生成して移動しますが、以下は公式pom法により実現します。
第一歩:プロジェクトルートディレクトリからpom.xmlファイルを生成する
前にサブプロジェクトディレクトリの下でpom.xmlファイルを生成する方式があったが、最終的に
標準外scope依存とは以下の通りです。
上の部分を歩いた後、mvnはやはりエラーを報告しました。原因は
まとめてみます。問題を解決する方法は公式文書を優先します。でも、今回の基本的なゲップは普通ではないです。次に、stackoverflowです。今回もだめです。最後に重要なのはソースコードの中に単一の測定やサンプルがあります。これは非常に重要な材料です。目的なしの検索ができなくなりました。
その他の問題
異常:
問題:UP-to-DATE:xmlとコピーjarパッケージを分割して、最終版のシナリオを見ます。
問題:少量のクラッチがあります。fixDependenciesで処理します。
問題:spring-aspectsはコンパイルできません。主にaspectの修飾の「類」はコンパイルできません。現在解決されていません。先にこのプロジェクトをフィルタリングします。
背景:プロジェクトのソースコードは
3.2.x
で、gradle
は4.10.2
です。最初はまず、Maven中央倉庫をアリ雲の中央倉庫に換えることです。実際にインストールを実行する時は必ず./gradlew install
を使って原生のgradle install
を使わないといけないです。最終版スクリプトアドレス一、mavenプラグインを追加する
まず
build.gradle
シナリオにmaven
を追加する。apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'
group = 'org.springframework'
version = '3.2.100-SNAPSHOT'
同時にgradle.properties
のバージョン番号を修正すれば、上記の通りで良いです。このとき、ルートディレクトリを実行する./gradlew install
は各モジュールの下にあるbuildディレクトリにpom-default.xml
を生成し、現在は直接使用できない。artifacts {
//archives sourcesJar //
//archives javadocJar //
}
artifacts {
//archives docsZip //
//archives schemaZip //schema
//archives distZip //dist
}
二、コピージョブを追加する前述したように、buildディレクトリの下で
pom-default.xml
を生成しますが、モジュールルートディレクトリの下ではなく、名前がpom.xml
と呼ばないので、使用できません。ルートディレクトリの下にコピーする必要があります。copyタスクをconfigure(subprojects - project(":spring-build-src")) { subproject ->
の下に追加することによって、2つの実施形態が可能である。1、案1
task copyPomXml(type: Copy, dependsOn: jar){
def fileExist = file("${subproject.buildDir}/poms/pom-default.xml").exists()
if (!fileExist) {
println("file ${subproject.buildDir}/poms/pom-default.xml not exist!")
}
println("from ${subproject.buildDir}/poms/pom-default.xml to ${subproject.projectDir}/pom.xml")
file("${subproject.buildDir}/poms/pom-default.xml").renameTo(file("${subproject.projectDir}/pom.xml"))
}
install.dependsOn(copyPomXml)
2、案二// jar , pom
task copyPomXml2(type: Copy, dependsOn: jar){
//from,to , ,
// , debug
from("${subproject.buildDir}/poms")
include '**/*.xml'
into file("${subproject.projectDir}/")
rename { filename ->
filename.replace 'pom-default', 'pom'
}
//
includeEmptyDirs = true
}
// install ,install
install.dependsOn(copyPomXml2)
ここまでルートディレクトリの下でpomファイルの生成を完成しました。本当に大変でした。長い間、いろいろな意味不明な問題に遭遇しました。主に異常なことが多いです。javaなどの言語に対して、位置づけ問題のコストは本当に高いです。しかし、多くのことが完璧ではなく、このようにして作られたpomには多くの依存項が欠けています。後の研究は、maven-publish
プラグインを使用して参照してください。参考2三、Graadleを通じてJarを発表し、リモート中央倉庫に行く。
この間、Mavenプロジェクトを何回も試しましたが、失敗しました。Gradeは直接にmaven中央倉庫を使うことができると思いますが、それは直接にmaven倉庫にもアップロードできますか?検索には2つの方法があります。
maven-publish
とuploadArchives
は、インターネットでもたくさん調べられました。本当に酔ってしまいました。公式文書も単一のモジュールの状況を紹介しました。本当に絶望しました。最後にGradeのGitHubソースの中にmultip-publicationの例があります。この例によれば、build.gradle
の最外層に下記のコードが追加されます。1、
maven-publish
プラグインを使用して、別々に配置する。第一歩:配布する中央倉庫の住所/登録情報を設定する
subprojects {
apply plugin: 'java'
apply plugin: 'maven-publish'
repositories {
mavenCentral()
}
publishing {
repositories {
maven {
url " maven "
credentials {
username 'a'
password 'b'
}
}
}
}
}
ステップ2:アーティファクト属性の設定リリース–プロジェクト別の設定次に、各ワード項目に下記のコードを追加します。以下の例は
project("spring-core"){}
です。publishing {
publications {
maven(MavenPublication) {
groupId = 'org.springframework'
artifactId = 'spring-core'
version = '3.2.100-SNAPSHOT'
from components.java
}
}
}
2、maven-publish
プラグインを使用して、共通の構成前に述べた方法はサブプロジェクトのサブプロジェクトの構成を要求しています。面倒くさいし、通用しないです。以下に汎用的な構成を提供します。
ステップ2:アーティファクト属性の設定リリース
第1ステップは直接的に省略して、前のように直接第2ステップに進み、subprojectを使って構成します。
subprojects {subproject ->
apply plugin: 'java'
apply plugin: 'maven-publish'
repositories {
mavenCentral()
}
publishing {
repositories {
maven {
url "maven "
credentials {
username 'a'
password 'b'
}
}
}
publications {
maven(MavenPublication) {
groupId = 'org.springframework'
artifactId = subproject.name
version = '3.2.100-SNAPSHOT'
from components.java
}
}
}
}
具体的に命令を出すと:./gradlew publish
(./gradlew publish -debug
は異常を見ることができる)3、
uploadArchives
プラグインを使用して、共通の構成subprojects {subproject ->
apply plugin: "java"
apply plugin: "maven"
uploadArchives {
repositories {
mavenDeployer {
repository(url: "maven ") {
authentication(userName: "a", password: "b")
}
pom.groupId == subproject.group
pom.artifactId == subproject.name
pom.version == subproject.version
}
}
}
}
4、maven
プラグインを使用したpom
方法でpom.xmlを生成して移動する。前述した方法はpom.xmlを生成して移動しますが、以下は公式pom法により実現します。
第一歩:プロジェクトルートディレクトリからpom.xmlファイルを生成する
subprojects {subproject ->
apply plugin: "java"
apply plugin: "maven"
//uploadArchives
task writeNewPom {
doLast {
pom {
project {
inceptionYear '2008'
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
}.writeTo("${subproject.projectDir}/pom.xml")
}
}
}
第二ステップ:pom.xmlにおけるエラーのscope問題を解決する。前にサブプロジェクトディレクトリの下でpom.xmlファイルを生成する方式があったが、最終的に
spring-core
を使用すると、例えばjopt-simple
はxmlに存在するが、そのscopeはoptional
であり、これは誤りであり、scopeがoptionalと定義されていないため、無効となった。解決策は、writeNewPom
に修正動作withXmlを追加します。task writeNewPom {
doLast {
pom {
project {
inceptionYear '2008'
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution 'repo'
}
}
}
withXml {
asNode().dependencies.'*'.findAll() {
it.scope.text() == 'optional' &&
project.configurations.compile.allDependencies.find { dep ->
dep.name == it.artifactId.text()
}
}.each { it.scope*.value = 'compile'}
}
}.writeTo("${subproject.projectDir}/pom.xml")
}
}
第二ステップ:標準的なscope依存性がないpom.xmlを解決します。標準外scope依存とは以下の通りです。
asm("org.ow2.asm:asm:${asmVersion}@jar")
asm("org.ow2.asm:asm-commons:${asmVersion}@jar")
cglib("cglib:cglib:${cglibVersion}@jar")
jarjar("com.googlecode.jarjar:jarjar:1.3")
この問題を解決するために、多くの資料を調べて、最終的にDependencyReportTaskにmvn dependency:tree
の機能があることを見つけました。だから研究して、taskを書いてpomを修正したらいいです。方法はconfigurations.all.each
を使用して構成される。まずDependencyReport Taskの使用例を示します。// mvn dependency:tree
task allDeps(type: DependencyReportTask) {}
allDeps.onlyIf {subproject.name == "spring-core"}
以下に解決策を示します。task doDependencies(dependsOn: writeNewPom) {
doLast {
def xmlRoot = new XmlParser().parse(file("${subproject.projectDir}/pom.xml"))
def depRoot = xmlRoot.dependencies
def depRootFirst = depRoot.first()
depRootFirst.dependency.each{dep ->
depRootFirst.remove(dep)
}
configurations.all.each { configuration ->
configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
def elem = artifact.moduleVersion.id
def dr = depRootFirst.appendNode("dependency")
dr.appendNode("groupId","${elem.group}")
dr.appendNode("artifactId","${elem.name}")
dr.appendNode("version","${elem.version}")
}
}
def printer = new XmlNodePrinter(new PrintWriter(new FileWriter("${subproject.projectDir}/pom.xml")))
printer.preserveWhitespace = true
printer.print(xmlRoot)
}
}
第三ステップ:pom.xmlの中にローカルjarのパケットの参照がないことを解決します。上の部分を歩いた後、mvnはやはりエラーを報告しました。原因は
spring-asm-repack
とspring-cglib-repack
の二つのカバンが見つからないからです。ソースを調べたら、このカバンは現地からjarカバンを引用する方式で使われていることが分かりました。また、他のカバンを通して名前を変えたのです。ここでまず現地から引用したコードを提供します。dependencies {
compile(files(cglibRepackJar))
compile(files(asmRepackJar))
}
GitHubの上に次のコードがあります。println "file-dependencies: " + configurations.compile.files { it instanceof FileCollectionDependency }.collect { it.name }
以下の案を分析してファイルの依存性を分析する方式を導出しました。task doDependencies(dependsOn: [writeNewPom, copyLocalJar]) {
if(subproject.name == "spring-core"){
dependsOn cglibRepackJar
}
doLast {
def xmlRoot = new XmlParser().parse(file("${subproject.projectDir}/pom.xml"))
def depRoot = xmlRoot.dependencies
def depRootFirst = depRoot.first()
//println(depRootFirst)
depRootFirst.dependency.each{dep ->
depRootFirst.remove(dep)
}
Map<String,String> map = new HashMap<String, String>()
configurations.all.each { configuration ->
configuration.resolvedConfiguration.resolvedArtifacts.each { artifact ->
def elem = artifact.moduleVersion.id
def key = "${elem.name}"
if(!map.containsKey(key)){
def dr = depRootFirst.appendNode("dependency")
dr.appendNode("groupId","${elem.group}")
dr.appendNode("artifactId","${elem.name}")
dr.appendNode("version","${elem.version}")
map.put(key, "1")
}
}
configuration.files { it instanceof FileCollectionDependency }.collect { it }.each { file ->
def key = "${file.name}"
def arr = file.name.split("-")
def sub = arr[0..arr.size()-2]
println(sub.toString())
String name = sub.join("-")
def version = arr[arr.size()-1].replace(".jar","")
if(!map.containsKey(key)){
def dr = depRootFirst.appendNode("dependency")
dr.appendNode("groupId","${subproject.group}")
dr.appendNode("artifactId","${name}")
dr.appendNode("version","${version}")
dr.appendNode("scope","system")
dr.appendNode("systemPath","${subproject.projectDir}/src/main/resources/lib/"+key)
map.put(key, "1")
}
}
}
def printer = new XmlNodePrinter(new PrintWriter(new FileWriter("${subproject.projectDir}/pom.xml")))
printer.preserveWhitespace = true
printer.print(xmlRoot)
}
}
}
compile(files
は、ファイル依存解析が完了するまで待つ必要があり、dependsOn cglibRepackJar
は、cglibRepackJarの後に声明しなければならない。このように実行してdoDependencies
が構築に成功した後、完全なpomファイルが生成される。そして実行:cd ./spring-core
mvn clean install -Dmaven.test.skip=true
やっとmavenの構築が成功したのを見ました。大変ですね。まとめてみます。問題を解決する方法は公式文書を優先します。でも、今回の基本的なゲップは普通ではないです。次に、stackoverflowです。今回もだめです。最後に重要なのはソースコードの中に単一の測定やサンプルがあります。これは非常に重要な材料です。目的なしの検索ができなくなりました。
その他の問題
異常:
./gradlew doDependencies
解決策:プラグイン倉庫Could not find org.springframework.build.gradle:propdeps-plugin:0.0.7-SNAPSHOT
をmaven { url "http://repo.spring.io/plugins-release" }
に変更し、maven { url "http://repo.spring.io/plugins-snapshot" }
にも変更する。問題:UP-to-DATE:xmlとコピーjarパッケージを分割して、最終版のシナリオを見ます。
問題:少量のクラッチがあります。fixDependenciesで処理します。
問題:spring-aspectsはコンパイルできません。主にaspectの修飾の「類」はコンパイルできません。現在解決されていません。先にこのプロジェクトをフィルタリングします。