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