如何application.properties
在远程 Linux 服务器上的现有 jar 文件中编辑属性文件(如 )。
想象一下 jar 位于/home/user/my-spring-boot.jar
,我喜欢将用户名更改为application.propertires
from
username=foo
到
username=bar
如何打开文件并更改属性?
.jar
文件只是.zip
具有不同扩展名的文件,可以vim
直接编辑 zip 文件及其内容!简单地说,使用文件导航器找到您的属性文件并进行更改vim
。将使用您的编辑来维护 zip。.jar
vim
有关更多详细信息,请参见此处。
可能的方法是将 jar 复制到 zip 文件中,提取,更改属性,压缩为 zip 并重命名为 jar
cp myJar.jar myJar.zip
unzip myJar.zip
vim myProperties.properties (doing the change here)
zip allMyFiles into myJar.zip
cp myJar.zip myModifiedJar.jar
更改现有的 JAR 工件不是一个好主意。相反,Spring Boot 允许您以多种方式轻松地使用外部值覆盖捆绑的属性。
例如,您可以application.properties
在 JAR 旁边放置一个文件,其中包含您想要覆盖的值。您甚至不需要将整个属性文件复制到那里,只需要复制您想要更改的属性,因为它仍然会退回到捆绑的默认值。
详细信息记录在这里:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
您可以这样做emacs
(在复制文件进行备份之后):
$ cp /home/user/bigExecutableJar.jar /home/user/bigExecutableJar.jar.bak
$ emacs /home/user/bigExecutableJar.jar
C-s
进行搜索。 RET
。C-x C-s
. C-x C-c
。使用 emacs 编辑 jar 文件上的内容
emacs jarfile
打开jar后,您可以浏览文件夹和文件。搜索 jdbc.properties 并对其进行编辑。然后使用 cx cs 保存更改。
注意:必须安装zip和unzip
我发现Java(或者更具体地说可能是Spring Boot)对JAR中文件的顺序很挑剔(引入了循环库依赖:“应用程序上下文中一些bean的依赖形成了一个循环”)。因此,需要一种保持顺序的方法。
解压缩原始 JAR并在生成的目录树1.jar
中unzip 1.jar
进行更改。2.jar
然后使用原始文件1.jar
作为参考,在保留文件顺序的同时生成一个新存档。
## -r = --recurse-paths
## -Z = --compression-method
zip -r -Z store 2.jar $(unzip -l 1.jar |tr -s ' ' |cut -d' ' -f5 |grep -v /$ )
zip -r -Z store 2.jar $(unzip -l 1.jar |tr -s ' ' |cut -d' ' -f5 |grep /$ )
这会将目录放在文件之后,这很奇怪,但我发现这是唯一可行的方法(关于循环依赖问题)。这两行可以合并为一个调用zip
,但为了整洁,我在这里将它们分开。
为了使订单保存工作,重要的是新的档案2.jar
要重新创建(不存在)。
Java 要求在不进一步压缩的情况下归档嵌套的 JAR 文件。完成此操作的最简单方法是使用-Z store
写入新存档的所有文件。这可能会导致新存档大于原始存档。
您可以使用以下内容查看存档的内部顺序(插入您最喜欢的图形差异实用程序)
diff <(unzip -t 1.jar) <(unzip -t 2.jar)
在 Ubuntu 18.04 上测试。
您可以jar
使用该jar xf bigExecutableJar.jar
命令解压缩档案。如果可以的话,我建议安装atool
,因为它提供了一个更好的命令行来打包/解包档案。
除非您知道如何处理vi
,否则请nano
用作编辑器。一些系统还mc
安装了一个基于控制台的文件浏览器,它有一个内置的编辑器。
更改文件后,您可以使用jar cf bigExecutableJar-new.jar -C .
(或atool --add
)再次打包存档
如果您真的想要/需要使用jar
,我建议您先在新目录中尝试该命令,因为它有时不会像您预期的那样运行。切勿在原始文件上使用它!
sed -i "s/\(customAuthHeaderName=\).*\$/\1${customAuthHeaderName}/" configuration.properties
sed -i "s/\(logoutPage=\).*\$/\1${logoutPage}/" configuration.properties
第二个customAuthHeaderName
值来自属性文件