Springソース(Grade管理)からMaven項目に移行します。


Springソース(Grade管理)からMaven項目に移行します。
背景:プロジェクトのソースコードは3.2.xで、gradle4.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-publishuploadArchivesは、インターネットでもたくさん調べられました。本当に酔ってしまいました。公式文書も単一のモジュールの状況を紹介しました。本当に絶望しました。最後に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-repackspring-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-SNAPSHOTmaven { url "http://repo.spring.io/plugins-release" }に変更し、maven { url "http://repo.spring.io/plugins-snapshot" }にも変更する。
問題:UP-to-DATE:xmlとコピーjarパッケージを分割して、最終版のシナリオを見ます。
問題:少量のクラッチがあります。fixDependenciesで処理します。
問題:spring-aspectsはコンパイルできません。主にaspectの修飾の「類」はコンパイルできません。現在解決されていません。先にこのプロジェクトをフィルタリングします。