我正在为spring boot项目设置构建管道。
到目前为止,它有三个阶段:build: compile-->unit test-->archive the jar
deploy acceptance test: repack the jar for acc environment (replacing datasource.properties etc)
deploy uat test: repack the jar for uat environment (replacing datasource.properties etc)
我不想从头开始为不同的环境构建jar,因为它浪费时间并且可能存在构建不一致的工件的风险。 对于传统的战争项目,我只是提取战争,替换配置文件并重新打包。但这次春季靴子,不知何故它不起作用。当我运行重新包装的jar时,它会报告
java.lang.IllegalStateException: Unable to open nested entry 'lib/antlr-2.7.7.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:378)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:355)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:341)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:92)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:68)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:60)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:45)
我提取了原始jar和重新包装的jar并且找不到lib文件夹的差异。
task extractArtifact() {
doLast {
def outputDirName = "${buildDir}/tmp/under_config"
def outputDir = file(outputDirName)
assert outputDir.deleteDir() // cleanup workspace
def zipFile = file("${buildDir}/libs/${getArtifactName()}")
copy {
from zipTree(zipFile)
into outputDir
}
copy {
from file("${buildDir}/env")
into file("${buildDir}/tmp/under_config")
}
}
}
task repackConfiguredArtifact(type: Zip, dependsOn: extractArtifact) {
archiveName = "${getArtifactName()}"
destinationDir = file("${buildDir}/libs/${getEnv()}")
from file("${buildDir}/tmp/under_config")
}
有没有人有想法?
或者你们如何为不同的环境配置jar(不重新编译二进制文件)。
答案 0 :(得分:3)
你只需将-0添加到商店;不使用ZIP压缩
$jar -cvf0m yourproject.jar META-INF/MANIFEST.MF .
还有另一个问题: Set the active Spring profiles
$java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
您可以使用应用程序 - $ {profile} .properties指定特定于配置文件的值。
答案 1 :(得分:1)
查找spring-boot参考后我有一个解决方案。
关闭默认弹簧启动重新包装,因为无论如何我需要重新包装它。
提取传统jar并复制配置文件
这是代码:
bootRepackage {
enabled = false
}
task extractArtifact() {
doLast {
def outputDirName = "${buildDir}/tmp/under_config"
def outputDir = file(outputDirName)
assert outputDir.deleteDir() // cleanup workspace
def zipFile = file("${buildDir}/libs/${getArtifactName()}")
copy {
from zipTree(zipFile)
into outputDir
}
copy {
from file("${buildDir}/env")
into file("${buildDir}/tmp/under_config")
}
assert zipFile.delete()
}
}
task clientJar(type: Jar, dependsOn: extractArtifact) {
archiveName = "${getArtifactName()}"
from file("${buildDir}/tmp/under_config")
}
task repackConfiguredArtifact(type: BootRepackage, dependsOn: clientJar) {
withJarTask = clientJar
}
答案 2 :(得分:-1)
我发现如果你有一个名为'resources / lib'的目录,那么spring-boot可执行文件JAR会假设内容被压缩并抛出上述异常。重命名为'resources / static'对我有用。