【问题标题】:Gradle - Multiple Jar from single projectGradle - 来自单个项目的多个 Jar
【发布时间】:2018-10-16 15:51:54
【问题描述】:

上下文:从单个项目创建多个可执行 jar - 多个包 gradle 项目

问题:我参考Link中提供的解决方案,这有助于在build->libs文件夹中生成jar,但是当我尝试执行jar时没有任何反应

注意:即使我把包名和java文件名一样,生成的jar也不会执行。

我还注意到生成的所有 jar 的文件大小是相同的。希望所面临的问题很清楚并等待关于我在哪里犯错的意见。

我的项目结构(说明目的):

ProjectA
-src
--main
---java
----pkg1
-----pkgCalculator         
------Calculator.java
-----pkgScale              
------Scale.java
----pkg2
-----pkgMusicPlayer        
------MusicPlayer.java
-----pkgVideoPlayer        
------VideoPlayer.java
---resources
----fxml
----css
--test
---java
---resources

Gradle 文件(下面的相关部分,根据上面的链接休息):

artifacts {
    archives jarPackage("pkgCalculator", "1.0"),
            jarPackage("pkgScale","1.0"),
            jarPackage("pkgMusicPlayer","1.0"),
            jarPackage("pkgVideoPlayer","1.0")

}

【问题讨论】:

  • 您应该检查生成的 jar 的内容,并确保包含所有需要的编译类(在正确的包中),并且 MANIFEST 具有正确的 Main-Class 属性
  • 在 jar 文件上尝试使用 jar tvf 命令,但它列出了太多文件,并且无法在终端中滚动到开头也猜测是由于显示的条目数量过多
  • 只是为了确定:您是否尝试将班级pkg1.pkgCalculator.Calculator 移动到calculator.Calculator(删除第一级pkg1)?并尝试提取 jar 内容以检查 MANIFEST,那里可能存在错误的 Main-Class 属性值...
  • 试过了,但还是不行。当我们执行 jar tvf 时,有没有办法暂停屏幕滚动,比如页面视图或其他什么?因为如果我只执行那个屏幕滚动太快并且看不到所有显示的东西。已检查 - docs.oracle.com/javase/8/docs/technotes/tools/windows/jar.html 但找不到它

标签: java gradle build.gradle executable-jar


【解决方案1】:

在与@iCoder 讨论后,问题的第一部分已经解决:jarPackage 函数不能“按原样”重用,必须进行调整以支持通用类/包布局:

def jarPackage(String jarName, String className, artifactVersion) {
    if (artifactVersion == "" || artifactVersion == null) {
        artifactVersion = "1.0.0"
    }
    return tasks.create("jar${jarName}", Jar) {
        baseName = jarName

        version = artifactVersion

        def String pkgName = className.substring(0, className.lastIndexOf("."))
        def String pkgDir = pkgName.replaceAll("\\.", "/")
        def String clazzName = className.substring( className.lastIndexOf(".") +1 )
        from(sourceSets.main.output) {
            include "$pkgDir//**"
        }

        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes "Implementation-Title": "$clazzName",
                    "Implementation-Version": "$version",
                    "Main-Class": "$pkgName.$clazzName"
        }
    }
}

artifacts {
    archives jarPackage("calculator", "pkg1.pkcalculator.Calculator" , "1.0.0")
}

另一个问题仍然存在,与 Gradle 无关,但与 JDK 11 链接问题有关:@iCoder 如果尚未修复,您应该针对该剩余问题打开另一个问题。

【讨论】:

  • 在构建中运行 jarPackage 函数后,我在构建中的额外 jar 中获得了我需要的子模块,但没有获得其余的依赖项,例如 springboot 依赖项。一种将我的其余依赖项包含在这个额外的 jar 中的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2019-02-21
  • 2014-05-09
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多