Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Ant到Gradle:可执行JAR转换_Java_Gradle_Ant_Jar_Executable Jar - Fatal编程技术网

Java Ant到Gradle:可执行JAR转换

Java Ant到Gradle:可执行JAR转换,java,gradle,ant,jar,executable-jar,Java,Gradle,Ant,Jar,Executable Jar,这件事我已经坚持了好几天了。我目前的任务是将相当多的ant脚本转换为gradle。我对两者的复杂性都不太熟悉,所以请原谅我的无知 我的代码中不使用依赖项或存储库,因为这是用于脱机pc的,但我需要的所有类和JAR都可以在本地使用。到目前为止,转换一直在进行中,但我仍然停留在可执行jar任务的转换上 这是(本质上)ant脚本: <target name="makeJar"> <jar destfile="someJar.jar"> <fileset dir=

这件事我已经坚持了好几天了。我目前的任务是将相当多的ant脚本转换为gradle。我对两者的复杂性都不太熟悉,所以请原谅我的无知

我的代码中不使用依赖项或存储库,因为这是用于脱机pc的,但我需要的所有类和JAR都可以在本地使用。到目前为止,转换一直在进行中,但我仍然停留在可执行jar任务的转换上

这是(本质上)ant脚本:

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

编辑:我发布了对我有用的内容。JBirdVegas的答案可能是一种更合适的方法。

您可以通过
配置
组件从类路径打包所有类。当然,如果需要的话,您可以在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'
}

对我读取.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'
    }
}
我使用.path而不是.name,因为有些子目录也包含JAR。使用.name会导致MD5哈希错误,因为它在不存在的目录中查找文件

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

我不太确定如何实现configurations.compile.collect,但使用zipTree(而不是使用fileTree)进行迭代正是我所需要的。configurations.compile.collect将自动将jar的类拉入到输出中。欢迎您专门指定JAR,但使用
配置
对象将允许您在添加更多LIB时仅更新
依赖项
块。
配置
对象可从任何
项目
对象获得。有关
配置的更多信息
请参阅:
{ it.name.endsWith('.jar') }.files.path