首页 > 解决方案 > Spring Framework 和 rpmbuild:无法获取用于条目的嵌套存档

问题描述

我正在使用 Spring Framework 为 java 程序创建 RPM。我一直试图理解为什么我的 jar 文件在通过 RPM 安装后不会执行。

--我遵循的步骤--

  1. 使用 Gradle 构建我的 java 程序以创建 jar 的构建快照。
  2. 运行创建的 jar。(有用!)
  3. 创建一个 .spec 文件以用于rpmbuild.
  4. 使用rpmbuild.
  5. yum 本地安装 rpm。
  6. 运行通过 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。

因为我使用rpmbuildfor 创建我的 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 似乎给我带来了麻烦。

标签: javaspringspring-bootrpmbuild

解决方案


推荐阅读