java - 从Ant到Gradle:可执行的JAR转换

标签 java gradle ant jar executable-jar

我已经坚持了好几天。我目前的任务是将许多 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的主类。)
我比较了从任何一个脚本中提取的.jar文件,并且目录结构存在非常严重的差异-从提取的jar文件中提取的pom各种各样,而gradle脚本不会生成。

我认为主要的问题是我不知道如何复制zipgroupfileset的效果。我以为我可以规避的方式似乎过多(提取jar,使用类文件复制到目录,对该目录进行jaring)。在这一点上,导入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的答案可能是更合适的方法。

最佳答案

您可以通过configurations组件将类路径中的所有类打包。当然,如果需要,您可以在中提供更多的逻辑,以仅包括特定文件或您的特定用例。

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

关于java - 从Ant到Gradle:可执行的JAR转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209051/

相关文章:

java - Big-O 复杂性 -> 查找数组元素之和是否等于目标

maven - 为 Java 项目设置暂存过程

eclipse - 如何将JavaFx项目转换为Gradle项目?

java - 访问 Jar 中的 .jpg 文件

java - ant build过程中修改代码的最佳实践

java - 通过主机操作系统与 VM 对话

java - 为什么 Eclipse 不断地在我的工作区中重建项目?

java - 阻塞队列和 InterruptedException

java - jOOQ 3.5.3 中的案例表达式和别名

gradle - 如何找到Gradle任务的 `type`?