Bryan

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            37 Posts :: 3 Stories :: 24 Comments :: 0 Trackbacks
          Most often, we need to build runnable jars for java library, and I go though several solutions, including shadow, and most of them process the dependencies as classes files in jar file which is not what we expected. and what we want are the runnable jar which includes user classes filles as well as all the dependencies jars in jar format. but in this way , we need extra classloader to load the jar libs in jar files and the following has provided the way of doing it.

          and I go though some most importance web pages and found three solutions for it.

          1. Eclipse jarinjarloader https://github.com/raisercostin/eclipse-jarinjarloader

          apply plugin: 'java'
          apply plugin: 'eclipse'
           
          sourceCompatibility = 1.6
          targetCompatibility = 1.6
          version = "4.3.3"

          processResources{
              exclude '**'
          }

          repositories {
              
          //jcenter()
              
          //maven { url "http://clojars.org/repo" }
          }

          dependencies {
              compile files('lib/jlibs-core.jar')
              compile files('lib/jlibs-xml.jar')
              compile files('lib/autonomyPiB.jar')
          }

          //add Class-Path to manifest
          task addDependToManifest {
              doFirst{        
                  
          if (!configurations.runtime.isEmpty()) {         
                      jar.manifest.attributes('Rsrc-Class-Path'"./ lib/" + configurations.runtime.collect { it.name }.join(' lib/'))
                  }
              }
          }
          jar.dependsOn += addDependToManifest
           
          //copy libs to output/mylibs/lib folder
          task copyDependencies(type: Copy) {
              from configurations.runtime
              destinationDir = file('build/mylibs/lib')
          }
          jar.dependsOn += copyDependencies

          jar{
              
          //include contents of output dir
              from "build/mylibs"
              
              from zipTree("lib/jar-in-jar-loader.zip")
              manifest {
                  attributes 'Implementation-Title': project.name,
                      
          'Class-Path''.',
                      
          'Rsrc-Main-Class''com.test.TestA',
                      
          'Main-Class''org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'
              }
          }


          2. spring boot gradle plugin

          we can also use spring boot gradle plugin to build our runnable jars.

          apply plugin: 'java'
          apply plugin: 'eclipse'

          //setting up spring boot gradle plugin which is used for building runnable jars
          buildscript {
              repositories {
                  maven { url 'https://repo.spring.io/libs-milestone' }
              }

              dependencies {
                  classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE'
              }
          }

          apply plugin: 'org.springframework.boot'
           
          sourceCompatibility = 1.6
          targetCompatibility = 1.6
          //version = "4.3.3" 

          tasks.withType(JavaCompile) {
              options.bootClasspath = "$JDK6_HOME/jre/lib/rt.jar"
          }

          if (project.hasProperty('env')) {
              println "Target environment: $env"
              sourceSets.main.resources.srcDir "src/main/profile/$env"
          }

          processResources{
              exclude 'TagNames.properties'
          }
           
          repositories {
              
          //jcenter()
              
          //maven { url "http://clojars.org/repo" }
          }
           
          dependencies {
              compile files('lib/jlibs-core.jar')
              compile files('lib/jlibs-xml.jar')
              compile files('lib/autonomyPiB.jar')
          }

          bootRepackage {
              mainClass = 'com.test.TestA'
          }


          3. the one-jar plugin in https://github.com/rholder/gradle-one-jar and this way also works, but if we upgrade to gradle 4.0+ we need to change the OneJar.groovy writeOneJarManifestFile as some function is deprecated.

              File writeOneJarManifestFile(Manifest manifest) {
           
                  File manifestFile = File.createTempFile("one-jar-manifest", ".mf")
                  manifestFile.deleteOnExit()
                  manifest.attributes.put("Main-Class", "com.simontuffs.onejar.Boot")
                  manifest.attributes.put("One-Jar-Main-Class", mainClass)
                  manifest.attributes.put("One-Jar-Show-Expand", showExpand)
                  manifest.attributes.put("One-Jar-Confirm-Expand", confirmExpand)
                  manifest.writeTo(manifestFile)
                  
                  return manifestFile
             }


          //create a runnable jar with all the dependencies using one-jar "gradle aweSomeFunJar"

          apply plugin: 'java'
          apply plugin: 'eclipse'

          buildscript {
              repositories {
                  mavenCentral()
              }
              dependencies {
                  classpath 'com.github.rholder:gradle-one-jar:1.0.4'
              }
          }
          apply plugin: 'gradle-one-jar'
           
          sourceCompatibility = 1.6
          targetCompatibility = 1.6
          version = "4.3.3" 

          processResources{
              exclude 'TagNames.properties'
          }
           
          repositories {
              
          //jcenter()
              
          //maven { url "http://clojars.org/repo" }
          }

          configurations{
              fatJarBuild
          }
           
          dependencies {

              compile files('lib/jlibs-core.jar')
              compile files('lib/jlibs-xml.jar')
              compile files('lib/autonomyPiB.jar')
              
              fatJarBuild files('lib/jlibs-core.jar')
              fatJarBuild files('lib/jlibs-xml.jar')
              fatJarBuild files('lib/autonomyPiB.jar')
          }

          task awesomeFunJar(type: OneJar) {
            mainClass 'com.test.TestA'
          }

          and I found for the first solution, the runnable jar can read external properties(properties in the same folder as the jar) and for other solution we can only include all our properties in the jar files.

          ----------------------JarInJarLoader Manifest---------------------------
          Manifest-Version: 1.0
          Implementation-Title: dataProcessing
          Rsrc-Class-Path: ./ lib/jlibs-core.jar lib/jlibs-xml.jar lib/autonomyP
           iB.jar
          Class-Path: .
          Rsrc-Main-Class: com.test.TestA
          Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

          ---------------------- spring boot gradle plugin Manifest---------------------------
          Manifest-Version: 1.0
          Start-Class: com.test.TestA
          Spring-Boot-Classes: .;BOOT-INF/classes/
          Spring-Boot-Lib: BOOT-INF/lib/
          Spring-Boot-Version: 1.5.4.RELEASE
          Main-Class: org.springframework.boot.loader.JarLauncher

          ----------------------One Jar Manifest---------------------------
          Manifest-Version: 1.0
          Ant-Version: Apache Ant 1.9.6
          Created-By: 1.8.0_101-b13 (Oracle Corporation)
          One-Jar-Confirm-Expand: false
          One-Jar-Show-Expand: false
          Main-Class: com.simontuffs.onejar.Boot
          One-Jar-Main-Class: com.test.TestA

          posted on 2017-06-20 19:25 Life is no respector of any genius. 閱讀(598) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 左权县| 无为县| 清流县| 襄汾县| 红原县| 萨嘎县| 伊川县| 桃园县| 漠河县| 易门县| 突泉县| 新民市| 庐江县| 蒲江县| 仪陇县| 乌恰县| 德清县| 泰和县| 连平县| 凤冈县| 黄陵县| 内江市| 汉中市| 黔东| 安平县| 化德县| 湟源县| 保靖县| 武城县| 峡江县| 南京市| 化德县| 左贡县| 浦江县| 剑川县| 西藏| 泰安市| 大方县| 太保市| 邵阳县| 陕西省|