一 可执行和可引用区别
SpringBoot项目内置了Maven代码管理,可以方便我们快捷生成可执行jar,无论是windows还是linux环境,可以简单使用java -jar这种命令是执行jar文件,但是可引用是无法完成的,boot-dev文件并不运行时文件添加在libs文件中,这也是可执行和可引用的区别。
二 Gradle代码管理生成可引用Jar
build.gradle
plugins { id 'java' } group 'com.nkr' version '1.0' // 设置 JDK 版本 sourceCompatibility = 1.8 targetCompatibility = 1.8 // 设置编译使用utf-8编码 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } tasks.withType(Javadoc) { options.encoding = 'UTF-8' } tasks.withType(Test) { systemProperty "file.encoding", "UTF-8" } repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} //mavenCentral() } dependencies { compile 'com.squareup.okhttp3:okhttp:3.1.2' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'cn.hutool:hutool-all:5.3.5' compile 'com.google.code.gson:gson:2.8.0' compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.2' // https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.codec //compile group: 'org.apache.directory.studio', name: 'org.apache.commons.codec', version: '1.8' testCompile group: 'junit', name: 'junit', version: '4.12' } jar{ doLast { copy{ from 'build/libs/interactsdk-1.0.jar' into '../interactsdk_testconsole/libs' } } } task generateversiontxt(){ doFirst { def date = new Date().format("yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+8")); def path = project.projectDir.path+"/src/main/resources/version.txt" def str = project.path + ' '+ date new File(project.projectDir.path+"/src/main/resources/").mkdirs(); new File(path).write("$str", 'UTF-8') } } compileJava.dependsOn(generateversiontxt) //jar { // manifest { // attributes "Implementation-Title": project.name // attributes "Implementation-Version": '1.0.0' // //attributes 'Main-Class': 'com.nkr.idacqTinyConsole' // } // from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // { // exclude "META-INF/*.SF" // exclude "META-INF/*.DSA" // exclude "META-INF/*.RSA" // exclude "META-INF/LICENSE" // exclude "META-INF/LICENSE.txt" // } // into('assets') { // from 'assets' // } //// if (!configurations.runtime.isEmpty()) { //// manifest.attributes('Class-Path': '. lib/' + configurations.runtime.collect { it.name }.join(' lib/')) //// } // // //} task FatJar(type:Jar, dependsOn:build){ manifest { attributes "Implementation-Title": project.name attributes "Implementation-Version": '1.0.0' //attributes 'Main-Class': 'com.nkr.idacqTinyConsole' } from "build/classes/java/main/" from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" exclude "META-INF/LICENSE" exclude "META-INF/LICENSE.txt" } into('assets') { from 'assets' } archiveName 'interactsdk.jar' // doLast{ //// copy{ //// from "$buildDir/libs/idacqC2.jar" //// into "Z:\\mayun\\android2\\SignalAcknCh\\app\\libs" //// } // copy{ // from("$buildDir/libs/idacqC2.jar") // into("/Users/usr/Code/idacqTinyShell/libs") // } // } } task dll(type:Exec, dependsOn:FatJar){ workingDir = "$buildDir/libs/" def myversion = '9.9.9' def outputname = 'interactsdk.dll' def mycmd = [ 'ikvmc', '-target:library', 'interactsdk.jar', //'-recurse:libs', "-out:$outputname", //"-version:$myversion", '-nologo' ] commandLine mycmd doLast{ mycmd.each { print it+' ' } println '' println 'generateDll Done '+ workingDir + "/$outputname" } }