我正在使用Spring Framework为java程序创建RPM。我一直试图理解为什么我的jar文件在通过RPM安装后不会执行。
- 我遵循的步骤 -
rpmbuild
一起使用的.spec文件。 rpmbuild
创建rpm。 - 问题 -
当试图通过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,我会收到压缩异常。
- 我的代码 -
小背景,这里的想法是我正在使用 Gradle 来构建我的java jar然后我想从我创建的jar中创建一个RPM,以便我可以像rpm一样安装jar。
由于我使用rpmbuild
创建我的rpm,因此这些是我的spec文件:
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版本会导致压缩异常。
我理解很有可能创建不使用rpmbuild
的RPM的其他方法,但我正在尝试学习如何使用rpmbuild
。在过去,我能够创建简单的rpm,只执行基本的“Hello World”指令,但Spring Framework似乎给我带来了麻烦。