我已经被困在这几天了 . 我目前的任务是将很多 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>
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'
}
}
EDIT: I posted what worked for me. JBirdVegas's answer is likely a more proper way of doing it.
2 回答
您可以通过
configurations
组件打包类路径中的所有类 . 当然,如果需要,您可以在from中提供更多逻辑,仅包含特定文件或任何特定用例 .对我如何阅读.jar文件做了一些调整 . 我现在使用zipTree()并迭代现有的jar文件,而不是使用fileTree() .
我使用.path而不是.name,因为有子目录也包含jar . 使用.name导致MD5哈希错误,因为它正在查找不存在的目录中的文件 .