首页 文章

Ant to Gradle:可执行JAR转换

提问于
浏览
2

我已经被困在这几天了 . 我目前的任务是将很多 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 回答

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

相关问题