9

Gradle ビルド スクリプトは、いくつかの jar と 1 つの war を含む EAR ファイルを作成します。これは以前はすべて Maven で行われており、現在は Gradle への移行の対象となっています。

環境:

  • グラドル 1.12
  • グルービー 2.2.1
  • Java 1.7.0_60 オラクル
  • エクリプス ケプラー SR 2

問題:

... 簡単です: これまでのところ動作します - ear プラグインは、すべてのモジュール ファイルを含む ear ファイルを作成します

deploy project(:core)

「依存関係」セクション内にあり、「core-0.0.1.jar」は ear-root にあり、モジュール エントリが application.xml に作成されています。ここで、ランタイム ライブラリが ear ファイルに含まれていないことがわかりました。だから私は(docuによると)インクルージョンを

earlib project(:core)

earプラグイン構成の「libDirName」プロパティに記載されているように、libsディレクトリ内にライブラリが見つかりました。しかし、現在、application.xml 内にモジュール エントリがなく、「core-0.0.1.jar」が libs ディレクトリ内にあります。

望ましい

ear ルート内のモジュールとして core-0.0.1.jar が必要であり、libs ディレクトリ内のすべてのランタイム ライブラリが必要です。モジュール自体からの jar は必要ありません。(core-0.0.1.jar は戦争ではありません!) そのように...

[APP.EAR]  
|--/libs  
|  |-- log4j.jar  
|  |-- commons.jar  
|  |>> app-core.0.0.1.jar <<== NOT !
|  
|-app-core-0.0.1.jar <== OK!  
|-app-xy-0.0.1.jar  
|-app-abc-0.0.1.war 

質問

これは私の側で EAR の概念が根本的に理解されていないためですか、それとも Gradle 自体が私たちが望むように動作しないのはなぜですか? それとも、この簡単な手順のために、より複雑な構成が必要になるのでしょうか?

4

2 に答える 2

10

私は自分で解決策を見つけました..他の投稿から多くの「解決策」を試した後。これが私がやったことであり、それは他のものの組み合わせです:

コアプロジェクトでは

提供された構成を作成したため、これらの依存関係はコンパイル構成に表示されず、プロジェクトのクラスパスに追加しました。したがって、それらはコンパイルクラスパスにありますが、コンパイル構成にはありません! 私はすべてのプロジェクトでそれを行いました。

// Libs need for compilation, but not to be published with EAR 
configurations { provided } 

dependencies {
    provided 'javax:javaee-api:6.0'
    provided 'org.slf4j:slf4j-api:1.7.7'

    compile 'com.application:application-common:1.4.5-SNAPSHOT'
}

configurations.provided.each { logger.debug("PROVIDED::core:  $it\n") }

// Include the PROVIDED libs into compile classpath
sourceSets { 
    main {  compileClasspath += configurations.provided }
}

EAR PROJECTでは

モジュール エントリとルート jar に「deploy project..」を含める必要がありました。推移的なライブラリの場合、「earlib project ..., configuration: 'compile'」を使用して、コンパイル構成内にあるファイル (したがって、jar の実行に必須) のみが ear にコピーされるようにしました。

apply plugin: 'ear' 

dependencies { 
    // INCLUDE AS A MODULE with entry in application.xml 
    deploy project(path: ':core')
    // INCLUDE the TRANSITIVE LIBRARIES FOR RUNTIME not provided
    earlib project(path: ':core', configuration: 'compile')
} 

ear { .... 
} 

それで全部です!

このために私は言わなければなりません.... GRADLE ROCKS!!!!

于 2014-06-27T13:24:54.260 に答える
2

ear モジュール間にコンパイル時の依存関係がある場合、受け入れられたソリューションは失敗します。これがGradle 2.14で解決した方法です。これが誰かに役立つことを願っています。

apply plugin: 'ear'

def deployedModules = [ 'projectA', 'projectB', 'projectC' ]

deployedModules.forEach {
    def projectPath = ":${it}"

    evaluationDependsOn(projectPath)

    dependencies.add('deploy', dependencies.project(path: projectPath,
                                                    configuration: 'archives'))
    findProject(projectPath).configurations.runtime.allDependencies.forEach {
        boolean isEarModule = it instanceof ProjectDependency &&
                (it as ProjectDependency).dependencyProject.name in deployedModules
        if (!isEarModule) {
            dependencies.add('earlib', it)
        }
    }
}
于 2016-07-01T21:48:23.293 に答える