Ant to Gradle:可执行JAR转换

时间:2016-08-29 14:46:01

标签: java gradle ant jar executable-jar

我已经被困在这几天了。我目前的任务是将很多蚂蚁脚本转换成gradle。我对这两者的复杂性都不是很熟悉,所以请原谅我的无知。

我不会在我的代码中使用依赖项或存储库,因为这是针对脱机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文件中。我认为我的主要问题是,当我运行我的gradle脚本时,它只是将所有类和jar加载在一起并且几乎将它们拉上来,所以它不可执行,尽管它应该是。 (这导致找不到SOME.ARCHIVE的Main-Class。) 我比较了从任何一个脚本中提取的.jars,并且在目录结构中存在非常严重的差异 - 来自提取的jar中的各种poms,gradle脚本没有生成。

我认为主要问题是我不知道如何复制zipgroupfileset的效果。我认为我可以规避的方式似乎过多(提取jar,复制到带有类文件的目录,jar-ing该目录)。那时,导入ant脚本并从gradle运行它似乎更有意义,但我不愿意。

这是我的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'
    }
}

编辑:我发布了对我有用的内容。 JBirdVegas的回答可能是更合适的做法。

2 个答案:

答案 0 :(得分: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'
}

答案 1 :(得分:0)

对我如何阅读.jar文件做了一些调整。 我现在使用zipTree()并迭代现有的jar文件,而不是使用fileTree()。​​

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'
    }
}

我使用.path而不是.name,因为有子目录也包含jar。使用.name导致MD5哈希错误,因为它在那个目录中寻找文件。

{ it.name.endsWith('.jar') }.files.path