我已经被困在这几天了。我目前的任务是将很多蚂蚁脚本转换成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的回答可能是更合适的做法。
答案 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