<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Bryan

      BlogJava :: 首頁 :: 聯(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. 閱讀(604) 評論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲Av永久无码精品一区二区| 最近中文字幕国语免费完整| 亚洲精品无码高潮喷水A片软| 亚洲综合激情五月色一区| 特黄特色大片免费| 男女作爱在线播放免费网站| 成人免费的性色视频| 在线视频免费国产成人 | 91福利免费体验区观看区| 亚洲成Av人片乱码色午夜| 亚洲Av无码一区二区二三区 | 久久精品国产亚洲av瑜伽| 久久免费国产精品一区二区| 午夜神器成在线人成在线人免费 | 亚洲va中文字幕无码久久| 亚洲人成网站18禁止| 日韩一区二区在线免费观看 | 成人免费看黄20分钟| 亚洲日韩中文无码久久| 亚洲一级大黄大色毛片| 无码日韩精品一区二区免费| 亚洲乱色熟女一区二区三区丝袜| 国内精品99亚洲免费高清| 大学生a级毛片免费观看| 国产成人亚洲综合a∨| 999久久久免费精品国产| 亚洲欧美日韩国产成人| 亚洲精品高清一二区久久| 国产午夜亚洲精品国产| av无码久久久久不卡免费网站| 久久夜色精品国产噜噜亚洲a| 韩国18福利视频免费观看| 久久久无码精品亚洲日韩京东传媒 | a级亚洲片精品久久久久久久| 亚洲熟妇AV日韩熟妇在线| 亚洲av无码成人精品区在线播放| 欧洲 亚洲 国产图片综合| 亚洲成?v人片天堂网无码| 久久大香香蕉国产免费网站| 亚洲色大成网站www| 日韩亚洲一区二区三区|