Skip to content

Commit 9c65a25

Browse files
dekobontjcelaya
authored andcommitted
Fix Java 9 Runtime Issues (#382)
* Added Azul zulu-8 JDK * Added JAVA_HOME to zulu-8 matrix entry * Removed jdk entry from zulu-8 matrix entry * Added cryptographic extensions to Zulu JDK install * Fixed mkdir to use -p * Fixed mkdir to use -p * Fixed unzip command * Moved cryptographic extensions install to before_script * Added sudo before unzip command * Fixed path to security directory. * Fixed key_url yaml entry * Removed Oracle JDK from apt install because it is preinstalled * Changed wget flag * Added explicit paths to extract policy files * Changed JAVA_HOME to zulu home directory * Added Oracle JDK 9 and Zulu 9 to test matrix * Fixed JCE installation for Zulu Java 9 * Removed OpenJDK 9 from Travis CI config because it isn't supported * Fixes Java 9 support for serialization model. See: #356 * Rolled back MantaVersion that was mistakenly checked in * Added additional commentary about details of Travis CI config * Fixed type check warnings in serializer * Fixed deprecation warnings * Fixed deprecation warnings
1 parent 8db8169 commit 9c65a25

5 files changed

Lines changed: 60 additions & 21 deletions

File tree

.travis.yml

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,36 @@ dist: trusty
22
language: java
33
# We now cache the Maven dependencies directory for faster builds
44
cache:
5+
apt: true
56
directories:
67
- $HOME/.m2
7-
sudo: false
8+
- $HOME/.downloads
9+
sudo: true
810

911
addons:
1012
apt:
13+
sources:
14+
- sourceline: 'deb http://repos.azulsystems.com/ubuntu stable main'
15+
key_url: 'http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems'
1116
packages:
12-
- oracle-java8-installer
13-
- oracle-java8-unlimited-jce-policy
17+
- zulu-8
18+
- zulu-9
19+
20+
# Oracle JDK 8 and the OpenJDK 8 are both installed by default by TravisCI
21+
# Additionally, they both have the unlimited JCE policy installed as well.
22+
# This is why we do not explicitly installed them in our Travis CI
23+
# configuration.
1424

1525
before_install:
1626
- echo 'MAVEN_OPTS="-Dorg.slf4j.simpleLogger.defaultLogLevel=warn"' >~/.mavenrc
27+
- mkdir -p $HOME/.downloads
28+
- wget -N -q -O $HOME/.downloads/ZuluJCEPolicies.zip 'https://cdn.azul.com/zcek/bin/ZuluJCEPolicies.zip'
29+
# The SHA256 checksum for JCE for Azul will break if Azul updates their archive.
30+
# If so, you will need to update the fingerprint below after verifying the
31+
# authenticity of the archive.
32+
- echo "8021a28b8cac41b44f1421fd210a0a0822fcaf88d62d2e70a35b2ff628a8675a $HOME/.downloads/ZuluJCEPolicies.zip" | sha256sum -c
33+
- sudo unzip -o -j $HOME/.downloads/ZuluJCEPolicies.zip ZuluJCEPolicies/local_policy.jar ZuluJCEPolicies/US_export_policy.jar -d /usr/lib/jvm/zulu-8-amd64/jre/lib/security
34+
- sudo unzip -o -j $HOME/.downloads/ZuluJCEPolicies.zip ZuluJCEPolicies/local_policy.jar ZuluJCEPolicies/US_export_policy.jar -d /usr/lib/jvm/zulu-9-amd64/lib/security
1735

1836
matrix:
1937
fast_finish: true
@@ -36,5 +54,22 @@ matrix:
3654
- DESC="openjdk8 unit tests"
3755
- CMD="mvn clean test -Dcheckstyle.skip=true"
3856
- LANG=en_US.utf8
57+
# unit tests (zulu-8)
58+
- env:
59+
- JAVA_HOME=/usr/lib/jvm/zulu-8-amd64
60+
- DESC="zulu-8 unit tests"
61+
- CMD="mvn clean test -Dcheckstyle.skip=true"
62+
- LANG=en_US.utf8
63+
- jdk: oraclejdk9
64+
env:
65+
- DESC="oraclejdk9 unit tests"
66+
- CMD="mvn clean test -Dcheckstyle.skip=true"
67+
- LANG=en_US.utf8
68+
# unit tests (zulu-9)
69+
- env:
70+
- JAVA_HOME=/usr/lib/jvm/zulu-9-amd64
71+
- DESC="zulu-9 unit tests"
72+
- CMD="mvn clean test -Dcheckstyle.skip=true"
73+
- LANG=en_US.utf8
3974

4075
script: echo ${CMD}; ${CMD}

java-manta-client-kryo-serialization/src/main/java/com/joyent/manta/serialization/BaseBlockCipherSerializer.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@
2525
import org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider;
2626
import org.bouncycastle.jcajce.spec.GOST28147ParameterSpec;
2727
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
28-
import org.objenesis.instantiator.sun.MagicInstantiator;
28+
import org.objenesis.instantiator.sun.UnsafeFactoryInstantiator;
2929

3030
import javax.crypto.spec.GCMParameterSpec;
3131
import javax.crypto.spec.IvParameterSpec;
3232
import javax.crypto.spec.PBEParameterSpec;
3333
import javax.crypto.spec.RC2ParameterSpec;
3434
import javax.crypto.spec.RC5ParameterSpec;
35+
3536
import java.lang.reflect.Field;
3637
import java.security.AlgorithmParameters;
3738

@@ -141,25 +142,25 @@ private void registerClasses(final Kryo kryo) {
141142
kryo.register(BufferedBlockCipher.class);
142143
kryo.register(bufferedGenericBlockCipherClass,
143144
new CompatibleFieldSerializer<>(kryo, bufferedGenericBlockCipherClass))
144-
.setInstantiator(new MagicInstantiator<>(bufferedGenericBlockCipherClass));
145+
.setInstantiator(new UnsafeFactoryInstantiator<>(bufferedGenericBlockCipherClass));
145146
kryo.register(SICBlockCipher.class)
146-
.setInstantiator(new MagicInstantiator<>(SICBlockCipher.class));
147+
.setInstantiator(new UnsafeFactoryInstantiator<>(SICBlockCipher.class));
147148
kryo.register(AlgorithmParameters.class);
148149
kryo.register(BCJcaJceHelper.class);
149150
kryo.register(ParametersWithIV.class)
150-
.setInstantiator(new MagicInstantiator<>(ParametersWithIV.class));
151+
.setInstantiator(new UnsafeFactoryInstantiator<>(ParametersWithIV.class));
151152
kryo.register(KeyParameter.class)
152-
.setInstantiator(new MagicInstantiator<>(KeyParameter.class));
153+
.setInstantiator(new UnsafeFactoryInstantiator<>(KeyParameter.class));
153154
kryo.register(paddedBufferedBlockCipherClass)
154-
.setInstantiator(new MagicInstantiator<>(paddedBufferedBlockCipherClass));
155+
.setInstantiator(new UnsafeFactoryInstantiator<>(paddedBufferedBlockCipherClass));
155156
kryo.register(CBCBlockCipher.class)
156-
.setInstantiator(new MagicInstantiator<>(CBCBlockCipher.class));
157+
.setInstantiator(new UnsafeFactoryInstantiator<>(CBCBlockCipher.class));
157158
kryo.register(AEADParameters.class, new CompatibleFieldSerializer<>(kryo, AEADParameters.class))
158-
.setInstantiator(new MagicInstantiator<>(AEADParameters.class));
159+
.setInstantiator(new UnsafeFactoryInstantiator<>(AEADParameters.class));
159160
kryo.register(aeadGenericBlockCipherClass, new CompatibleFieldSerializer<>(kryo, aeadGenericBlockCipherClass))
160-
.setInstantiator(new MagicInstantiator<>(aeadGenericBlockCipherClass));
161+
.setInstantiator(new UnsafeFactoryInstantiator<>(aeadGenericBlockCipherClass));
161162
kryo.register(GCMBlockCipher.class, new CompatibleFieldSerializer<>(kryo, GCMBlockCipher.class))
162-
.setInstantiator(new MagicInstantiator<>(GCMBlockCipher.class));
163+
.setInstantiator(new UnsafeFactoryInstantiator<>(GCMBlockCipher.class));
163164
kryo.register(RC2ParameterSpec.class);
164165
kryo.register(RC5ParameterSpec.class);
165166
kryo.register(GCMParameterSpec.class);

java-manta-client-kryo-serialization/src/main/java/com/joyent/manta/serialization/CipherSerializer.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.esotericsoftware.kryo.serializers.JavaSerializer;
1515
import org.bouncycastle.jcajce.provider.symmetric.AES;
1616
import org.objenesis.instantiator.sun.MagicInstantiator;
17+
import org.objenesis.instantiator.sun.UnsafeFactoryInstantiator;
1718

1819
import javax.crypto.Cipher;
1920
import javax.crypto.spec.SecretKeySpec;
@@ -94,10 +95,10 @@ private void registerClasses(final Kryo kryo) {
9495
kryo.register(IdentityHashMap.class, new JavaSerializer());
9596

9697
kryo.register(java.lang.ref.WeakReference.class)
97-
.setInstantiator(new MagicInstantiator<>(java.lang.ref.WeakReference.class));
98+
.setInstantiator(new UnsafeFactoryInstantiator<>(java.lang.ref.WeakReference.class));
9899

99100
kryo.register(java.security.AlgorithmParameters.class)
100-
.setInstantiator(new MagicInstantiator<>(java.security.AlgorithmParameters.class));
101+
.setInstantiator(new UnsafeFactoryInstantiator<>(java.security.AlgorithmParameters.class));
101102

102103
kryo.register(SecretKeySpec.class, new JavaSerializer());
103104

@@ -142,7 +143,7 @@ private void registerWithCompatSerializerMagicInstantiator(final Kryo kryo, fina
142143

143144
if (clazz != null) {
144145
kryo.register(clazz, new CompatibleFieldSerializer<>(kryo, clazz))
145-
.setInstantiator(new MagicInstantiator<>(clazz));
146+
.setInstantiator(new UnsafeFactoryInstantiator<>(clazz));
146147
}
147148
}
148149

@@ -170,7 +171,7 @@ private void registerWithMagicInstantiator(final Kryo kryo, final String classNa
170171
Class<?> clazz = findClass(className);
171172

172173
if (clazz != null) {
173-
kryo.register(clazz).setInstantiator(new MagicInstantiator<>(clazz));
174+
kryo.register(clazz).setInstantiator(new UnsafeFactoryInstantiator<>(clazz));
174175
}
175176
}
176177

java-manta-client-kryo-serialization/src/main/java/com/joyent/manta/serialization/EncryptionStateSerializer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import com.joyent.manta.util.HmacOutputStream;
2222
import org.bouncycastle.crypto.macs.HMac;
2323
import org.bouncycastle.jcajce.io.CipherOutputStream;
24-
import org.objenesis.instantiator.sun.MagicInstantiator;
24+
import org.objenesis.instantiator.sun.UnsafeFactoryInstantiator;
2525

2626
import javax.crypto.Cipher;
2727
import javax.crypto.SecretKey;
@@ -72,7 +72,7 @@ public EncryptionStateSerializer(final Kryo kryo,
7272
*/
7373
private void registerClasses(final Kryo kryo) {
7474
kryo.register(EncryptionContext.class)
75-
.setInstantiator(new MagicInstantiator<>(EncryptionContext.class));
75+
.setInstantiator(new UnsafeFactoryInstantiator<>(EncryptionContext.class));
7676
kryo.register(SupportedCipherDetails.class, new SupportedCipherDetailsSerializer());
7777
kryo.register(AesCtrCipherDetails.class, new SupportedCipherDetailsSerializer());
7878
kryo.register(AesCbcCipherDetails.class, new SupportedCipherDetailsSerializer());
@@ -85,9 +85,9 @@ private void registerClasses(final Kryo kryo) {
8585
"CloseShieldOutputStream reference must not be null");
8686

8787
kryo.register(closeShieldStreamClass)
88-
.setInstantiator(new MagicInstantiator<>(closeShieldStreamClass));
88+
.setInstantiator(new UnsafeFactoryInstantiator<>(closeShieldStreamClass));
8989
kryo.register(CipherOutputStream.class)
90-
.setInstantiator(new MagicInstantiator<>(CipherOutputStream.class));
90+
.setInstantiator(new UnsafeFactoryInstantiator<>(CipherOutputStream.class));
9191
}
9292

9393
/**

java-manta-client-kryo-serialization/src/main/java/com/joyent/manta/serialization/ReflectionUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ static Field getField(final Class<?> clazz, final String name) {
115115
* @param object object to read from
116116
* @return field's value
117117
*/
118+
@SuppressWarnings("deprecation")
118119
static Object readField(final Field field, final Object object) {
119120
Objects.requireNonNull(field, "Field must not be null");
120121
Objects.requireNonNull(object, "Object must not be null");
@@ -142,6 +143,7 @@ static Object readField(final Field field, final Object object) {
142143
* @param target target object
143144
* @param value object to write
144145
*/
146+
@SuppressWarnings("deprecation")
145147
static void writeField(final Field field, final Object target, final Object value) {
146148
Objects.requireNonNull(field, "Field must not be null");
147149
Objects.requireNonNull(target, "Target must not be null");

0 commit comments

Comments
 (0)