java - Spring Framework 和 rpmbuild:无法获取用于条目的嵌套存档
问题描述
我正在使用 Spring Framework 为 java 程序创建 RPM。我一直试图理解为什么我的 jar 文件在通过 RPM 安装后不会执行。
--我遵循的步骤--
- 使用 Gradle 构建我的 java 程序以创建 jar 的构建快照。
- 运行创建的 jar。(有用!)
- 创建一个 .spec 文件以用于
rpmbuild
. - 使用
rpmbuild
. - yum 本地安装 rpm。
- 运行通过 rpm 安装的 jar。(它不起作用。)
--问题--
尝试运行通过 rpm 安装的 java jar 时收到错误消息。
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/commons-io-2.4.jar
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/commons-io-2.4.jar'
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:254)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:239)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
... 4 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/commons-io-2.4.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:282)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:262)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:250)
... 6 more
我认为这与如何rpmbuild
压缩罐子有关。原因是当我使用Gradle构建我的 java 项目时,我能够很好地运行我的 jar。但是,如果我尝试从rpmbuild
我正在创建的 jar 中运行 jar,我会收到压缩异常。
--我的代码--
一点背景,这里的想法是我使用Gradle来构建我的 java jar,然后我想从我创建的 jar 中创建一个 RPM,这样我就可以像 rpm 一样安装 jar。
因为我使用rpmbuild
for 创建我的 rpm,所以这些是我的规范文件:
Name: ${NAME}
Version: ${VERSION}
Release: 1%{?dist}
Summary: Sample
AutoReqProv: no
License: GPLv3+
URL:
Source0: ${NAME}-${VERSION}.tar.gz
%description
Sample
%setup -q
%prep
cd ${SCRIPTPATH}
cp -rf ${NAME}/ \$RPM_BUILD_DIR/
%build
%install
rm -rf \$RPM_BUILD_ROOT
mkdir -p \$RPM_BUILD_ROOT/opt/sample/
cp -rf \$RPM_BUILD_DIR/${NAME}/${NAME}-sample-0.0.10.BUILD-SNAPSHOT.jar \$RPM_BUILD_ROOT/opt/sample/sample-tool-1.0/sample-tool.jar
%clean
rm -rf \$RPM_BUILD_ROOT
%files
/opt/sample/
%defattr(-,root,root,-)
%doc
%changelog
该规范是通过一个简单的脚本构建的,您所做的就是传递${NAME}
并${VERSION}
通过它来填充这些变量。也是${NAME}-sample-0.0.10.BUILD-SNAPSHOT.jar
我试图运行的 jar 文件。我可以正常运行此 jar 的内置非 rpm 版本,但尝试运行通过 rpm 安装的 jar 版本会导致压缩异常。
我知道创建 RPM 的其他方法很可能不涉及使用rpmbuild
,但我正在尝试学习如何使用rpmbuild
. 在过去,我能够创建简单的 rpm 来执行基本的“Hello World”指令,但 Spring Framework 似乎给我带来了麻烦。
解决方案
推荐阅读
- apache - .htaccess 规则将子文件夹移动到新域
- php - 尝试登录时 Drupal 访问被拒绝错误
- java - Spring Data Rest 和计数查询
- python - Python 正则表达式匹配分组
- vba - Excel 高级过滤器不返回任何数据
- javascript - 将 html 表单发送到 node.js,处理数据并将该数据提供给另一个页面
- c# - 如何附加/连接到现有的 Ignite 节点
- python - 使用 set() 创建一个随机数
- cassandra - SSTables 行时间戳分布与 TWCS 混淆
- java - Spring @Value 对待不同的原语和包装类