-
Notifications
You must be signed in to change notification settings - Fork 123
Description
Problem:
VersionInfo#loadUserAgent tries to load a version from a file, this fails catastrophically when this library is packed with the spring-boot-maven-plugin: the result of ClassLoader.getSystemResourceAsStream("project.properties")
is null, triggering a NullPointerException which is not handled, which results in the following error for me.
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.encryptionsdk.kms.KmsMasterKey
aws-encryption-sdk-java/src/main/java/com/amazonaws/encryptionsdk/kms/KmsMasterKey.java
Lines 54 to 55 in 163d79f
public final class KmsMasterKey extends MasterKey<KmsMasterKey> implements KmsMethods { | |
private static final String USER_AGENT = VersionInfo.loadUserAgent(); |
aws-encryption-sdk-java/src/main/java/com/amazonaws/encryptionsdk/internal/VersionInfo.java
Lines 27 to 35 in 163d79f
public static String loadUserAgent() { | |
try { | |
final Properties properties = new Properties(); | |
properties.load(ClassLoader.getSystemResourceAsStream("project.properties")); | |
return USER_AGENT_PREFIX + properties.getProperty("version"); | |
} catch (final IOException ex) { | |
return USER_AGENT_PREFIX + UNKNOWN_VERSION; | |
} | |
} |
Works fine directly (IntelliJ run), but debugging the app within my docker-build clearly shows the issue:
application.jar packed with
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version> <!-- EDIT: also tested latest = 2.5.1 -->
</plugin>
Solution(s):
- Handle a null resource stream, and/or catch NullPointerExceptions here as well as IOExceptions.
- Or simply hard-code the version directly in this file rather than delegating to a properties resource?
- Use a classLoader from the same jar, e.g., the following works in my debugger:
properties.load(VersionInfo.class.getClassLoader().getResourceAsStream("project.properties"));