2016-08-29 7 views
2

私はこれを数日間続けてきました。私は現在、かなりの数のantスクリプトをgradleに変換することを任されています。私はどちらかの複雑さにあまり慣れていないので、私の無知を許してください。Ant to Gradle:実行可能なJAR変換

これはオフラインPC用のものなので、私は依存関係やリポジトリをコードに使用しませんが、私が必要とするすべてのクラスとjarファイルはローカルで利用できます。今のところ変換は進んでいますが、私は実行可能なjarタスクの変換にむしろ固執しています。

<target name="makeJar"> 
    <jar destfile="someJar.jar"> 
    <fileset dir="somePlace"/> 
    <fileset dir="someOtherPlace"/> 
    <manifest> 
     <attribute name="Main-Class" value="SOME.ARCHIVE.Main"/> 
    </manifest> 
    <zipgroupfileset dir="localFiles" includes="*.jar"/> 
    </jar> 
</target> 

SOME.ARCHIVEは、ローカル.jarファイルの一つである:

これは、Antスクリプト(基本的に)です。私の大きな問題は、私がgradleスクリプトを実行すると、すべてのクラスとjarファイルが一緒に読み込まれて、ちょうどそれらが圧縮されるためです。実行可能ファイルではありません。 (これにより、SOME.ARCHIVEのメインクラスが見つかりません) 抽出された.jarsをスクリプトと比較し、ディレクトリ構造には非常に大きな違いがあります。 gradleスクリプトは生成されません。

私はzipgroupfilesetの効果をどのように再現するのか分かりません。私が回避することができると仮定する方法は、過剰な(jarファイルの抽出、クラスファイルを含むディレクトリへのコピー、そのディレクトリのjarファイル)と思われます。その時点では、antスクリプトをインポートしてgradleから実行する方が理にかなっているようですが、そうしたくないと思います。

task makeJar (type: Jar) { 
    baseName = "someJar" 
    from files('somePlace') 
    from files('someOtherPlace') 
    from fileTree(dir: 'localFiles', include: '*.jar') 

    manifest { 
     attributes 'Main-Class': 'SOME.ARCHIVE.Main' 
    } 
} 

EDIT:

は、ここに私のGradleスクリプトだ私は私のために働いていたものを掲載しました。 JBirdVegasの答えは、これを実行するより適切な方法でしょう。

答えて

0

クラスパスからすべてのクラスをconfigurationsコンポーネントでパッケージ化できます。もちろん、必要に応じて、特定のファイルや特定のユースケースがどのようなものであっても、fromの中にもっと多くのロジックを含めることができます。

task fatJar(type: Jar) { 
    manifest.attributes = jar.manifest.attributes 
    includeEmptyDirs = jar.includeEmptyDirs 
    baseName = project.name + '-fat' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

jar { 
    manifest { 
     attributes 'Implementation-Title': 'My executable jar!', 
       'Implementation-Version': version, 
       'Main-Class': 'com.example.so.q39209051.Main' 
    } 
    includeEmptyDirs false 
    dependsOn 'fatJar' 
} 
+0

configuration.compile.collectの実装方法は厳密にはわかりませんが、zipTree(fileTreeを使用するのではなく)を反復することは、私が必要としていたものとまったく同じです。 – AlexG

+0

'configurations.compile.collect'はあなたのjarのクラスを出力に自動的に引き込みます。 jarを特に指定する代わりに、 'configuration'オブジェクトを使用することを歓迎します。これにより、libsを追加するときに' dependencies'ブロックのみを更新することができます。 'configuration'オブジェクトは' project'オブジェクトから利用できます。 'configuration'の詳細については、https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.htmlを参照してください。 – JBirdVegas

0

.jarファイルの読み方を調整しました。 fileTree()を使用する代わりに、zipTree()を使用して既存のjarファイルを反復処理するようになりました。

task makeJar (type: Jar) { 
    baseName = "someJar" 
    from files('somePlace') 
    from files('someOtherPlace') 

    def mahJars = fileTree('localFiles').filter { it.name.endsWith('.jar') }.files.path 
    mahJars.each { one -> from zipTree("$one") } 

    manifest { 
     attributes 'Main-Class': 'SOME.ARCHIVE.Main' 
    } 
} 

jarsを含むサブディレクトリがあるため、.nameの代わりに.pathを使用します。 .nameを使用すると、そこになかったディレクトリ内のファイルを探していたのでMD5ハッシュエラーが発生しました。

{ it.name.endsWith('.jar') }.files.path 
関連する問題