打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
gradle生成可运行jar包
        在http://blog.csdn.net/zero__007/article/details/50708166中简单介绍了使用gradle生成可运行jar包,但是在实践中可能会发现,生成的jar中包含一些不需要的文件,可以采用如下的示例来去除:
  1. apply plugin: 'scala'
  2. apply plugin: 'java'

  3. [compileJava, compileTestJava, javadoc]*.options*.encoding = 'utf-8'
  4. [compileJava, compileTestJava]*.sourceCompatibility = "1.8"
  5. [compileJava, compileTestJava]*.targetCompatibility = "1.8"

  6. ext {
  7. jarName = project.name
  8. mainClassName = 'com.zero.HelloWorld'
  9. finagleVersion = '6.33.0'//注意: ' 与 "
  10. }

  11. repositories {
  12. mavenLocal()
  13. maven { url 'http://maven.oschina.net/content/groups/public/' }
  14. maven { url 'http://uk.maven.org/maven2/' }
  15. maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
  16. maven { url 'https://repo.spring.io/libs-snapshot/' }
  17. mavenCentral()
  18. }

  19. project.configurations {
  20. all*.exclude group: 'log4j', module: 'log4j'
  21. all*.exclude group: 'org.slf4j', module: 'slf4j-log4j12'
  22. }

  23. dependencies {
  24. compile "org.scala-lang:scala-library:2.11.8"
  25. compile "org.scala-lang:scala-compiler:2.11.8"
  26. compile "org.scala-lang:scala-reflect:2.11.8"

  27. //finagle
  28. compile "com.twitter:finagle-core_2.11:${finagleVersion}"
  29. compile "com.twitter:finagle-http_2.11:${finagleVersion}"
  30. compile "com.twitter:finagle-mysql_2.11:${finagleVersion}"
  31. compile "com.twitter:finagle-redis_2.11:${finagleVersion}"

  32. //。。。。。。
  33. }

  34. task "mkdirs" << {
  35. sourceSets*.scala.srcDirs*.each { it.mkdirs() }
  36. sourceSets*.java.srcDirs*.each { it.mkdirs() }
  37. sourceSets*.resources.srcDirs*.each { it.mkdirs() }
  38. }

  39. jar.manifest.attributes 'Main-Class': mainClassName
  40. jar.baseName = jarName

  41. jar {
  42. from {
  43. configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  44. configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
  45. }
  46. exclude('LICENSE.txt', 'NOTICE.txt', 'rootdoc.txt')
  47. exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
  48. exclude 'META-INF/NOTICE', 'META-INF/NOTICE.txt'
  49. exclude 'META-INF/LICENSE', 'META-INF/LICENSE.txt'
  50. exclude 'META-INF/DEPENDENCIES'
  51. }

  52. // important(把java与scala的源代码目录全映射到scala上,
  53. // 这样gradle compileScala时就能同时编译java与scala的源代码)
  54. sourceSets {
  55. main {
  56. scala {
  57. srcDirs = ['src/main/scala', 'src/main/java']
  58. }
  59. java {
  60. srcDirs = []
  61. }
  62. }

  63. test {
  64. scala {
  65. srcDirs = ['src/test/scala', 'src/test/java']
  66. }
  67. java {
  68. srcDirs = []
  69. }
  70. }
  71. }
       上面的jar任务中,会exclude第三方jar包的LICENSE.txt、NOTICE.txt等不需要的文件。

       但是上面的方式生成的jar包还是过大,能不能不把第三方jar包打入我们自己的jar中,而是在一个lib目录,然后运行我们应用程序时,再去引入这些第三方jar呢?gradle提供这样的插件:application。
       示例:
  1. apply plugin: 'scala'
  2. apply plugin: 'java'
  3. apply plugin: 'application'

  4. [compileJava, compileTestJava, javadoc]*.options*.encoding = 'utf-8'
  5. [compileJava, compileTestJava, compileScala]*.sourceCompatibility = "1.8"
  6. [compileJava, compileTestJava, compileScala]*.targetCompatibility = "1.8"

  7. // generate gradle wrapper
  8. task wrapper(type: Wrapper) {
  9. gradleVersion = '2.14.1'
  10. }

  11. // scala compiler options
  12. tasks.withType(ScalaCompile) {
  13. sourceCompatibility = 1.8
  14. targetCompatibility = 1.8
  15. configure(scalaCompileOptions.forkOptions) {
  16. memoryMaximumSize = '512m'
  17. }
  18. }

  19. ext {
  20. finagleVersion = '6.36.0'
  21. projectpath = '/xxx/yyy'
  22. }

  23. applicationName = 'xxx' // name of tar, zip and script
  24. mainClassName = 'com.zero.HelloWorld' // project main class name

  25. jar {
  26. exclude '*.conf', '*.xml'
  27. }

  28. repositories {
  29. //略
  30. }

  31. project.configurations {
  32. //略
  33. }

  34. dependencies {
  35. //略
  36. }

  37. task "mkdirs" << {
  38. //略
  39. }

  40. sourceSets {
  41. //略
  42. }

  43. // customize gradle distribution
  44. distributions {
  45. main {
  46. contents {
  47. into('conf') {
  48. from { 'src/main/resources' }
  49. }
  50. }
  51. contents {
  52. into('bin') {
  53. from { 'src/main/bash/xxx.sh' }
  54. }
  55. }
  56. }
  57. }

  58. // project runtimes JVM options
  59. applicationDefaultJvmArgs = ["-server",
  60. "-Dproject.home=${projectpath}",
  61. "-Dlog4j.configurationFile=${projectpath}/conf/log4j2.xml",
  62. "-Xms16g",
  63. "-Xmx16g",
  64. //略
  65. ]
       项目的工程目录结构如下:
  1. /src
  2. /src/main
  3. /src/main/bash
  4. /src/main/bash/xxx.sh
  5. /src/main/java
  6. /src/main/resources
  7. /src/main/resources/xxx.conf
  8. /src/main/resources/log4j2.xml
  9. /src/main/scala
  10. /src/test
       运行gradle build后在build/distributions目录中会生成projectname.tar和projectname.zip文件,解压后会有bin、conf、lib这三个目录。lib目录中是我们应用程序的jar和第三方jar。在conf目录中,由于
  1. jar {
  2. exclude '*.conf', '*.xml'
  3. }
       这会限制将*.conf、*.xml即相关配置文件打入jar包,而是将其移动到conf目录中:
  1. contents {
  2. into('conf') {
  3. from { 'src/main/resources' }
  4. }
  5. }
       这就方便修改配置文件,但是需要在代码中额外指定配置文件加载路径。于是我们在JVM启动参数中配置了"-Dproject.home=${projectpath}",这样就可以找到配置文件了。同时也将可能用到的shell脚本移动到bin目录中:
  1. contents {
  2. into('bin') {
  3. from { 'src/main/bash/xxx.sh' }
  4. }
  5. }
       在bin目录中,除了我们的脚本,插件还会为我们生成projectname和projectname.bat脚本,在上述两脚本中指定了JVM运行参数,即我们在build. gradle中写明的,还有jar启动脚本(会运行我们的jar,并将第三方jar添加至到-classpath参数中)。我们只需要在bin、conf、lib同级目录中运行bin/project(linux下)即可运行我们的应用程序。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Eclipse 安装Gradle插件
ZooKeeper学习之路 (四)ZooKeeper开发环境eclipse配置
Android Studio 简单介绍和使用问题小结
初学者maven环境配置思路整理
用最简单的gradle代码,解决你java项目中的jar依赖之苦
自动化管理项目,Maven仓库配置、安装和使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服