로컬 환경 : m1 arm64
Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_resolver_dns_native_macos_aarch_64.jnilib #
Spring Cloud Gateway + Mock API 구성 후 간단한 테스트 시 다음과 같은 오류가 발생한다.
java.lang.reflect.InvocationTargetException: null
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
...
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
Caused by: java.lang.UnsatisfiedLinkError: failed to load the required native library
at io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.ensureAvailability(MacOSDnsServerAddressStreamProvider.java:110) ~[netty-resolver-dns-classes-macos-4.1.78.Final.jar:4.1.78.Final]
at io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.<init>(MacOSDnsServerAddressStreamProvider.java:120) ~[netty-resolver-dns-classes-macos-4.1.78.Final.jar:4.1.78.Final]
... 125 common frames omitted
Caused by: java.lang.UnsatisfiedLinkError: could not load a native library: netty_resolver_dns_native_macos_aarch_64
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.loadNativeLibrary(MacOSDnsServerAddressStreamProvider.java:92) ~[netty-resolver-dns-classes-macos-4.1.78.Final.jar:4.1.78.Final]
at io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.<clinit>(MacOSDnsServerAddressStreamProvider.java:77) ~[netty-resolver-dns-classes-macos-4.1.78.Final.jar:4.1.78.Final]
at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
at java.base/java.lang.Class.forName(Class.java:398) ~[na:na]
at io.netty.resolver.dns.DnsServerAddressStreamProviders$1.run(DnsServerAddressStreamProviders.java:50) ~[netty-resolver-dns-4.1.78.Final.jar:4.1.78.Final]
at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
at io.netty.resolver.dns.DnsServerAddressStreamProviders.<clinit>(DnsServerAddressStreamProviders.java:46) ~[netty-resolver-dns-4.1.78.Final.jar:4.1.78.Final]
... 120 common frames omitted
Suppressed: java.lang.UnsatisfiedLinkError: could not load a native library: netty_resolver_dns_native_macos
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:239) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.loadNativeLibrary(MacOSDnsServerAddressStreamProvider.java:95) ~[netty-resolver-dns-classes-macos-4.1.78.Final.jar:4.1.78.Final]
... 126 common frames omitted
Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_resolver_dns_native_macos.jnilib
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:181)
... 127 common frames omitted
Suppressed: java.lang.UnsatisfiedLinkError: no netty_resolver_dns_native_macos in java.library.path: [/Users/leehyunjae/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2673)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
at java.base/java.lang.System.loadLibrary(System.java:1873)
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:391)
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161)
... 127 common frames omitted
Suppressed: java.lang.UnsatisfiedLinkError: no netty_resolver_dns_native_macos in java.library.path: [/Users/leehyunjae/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2673)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
at java.base/java.lang.System.loadLibrary(System.java:1873)
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:425)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:417)
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:383)
... 128 common frames omitted
Caused by: java.io.FileNotFoundException: META-INF/native/libnetty_resolver_dns_native_macos_aarch_64.jnilib
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:181) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
... 127 common frames omitted
Suppressed: java.lang.UnsatisfiedLinkError: no netty_resolver_dns_native_macos_aarch_64 in java.library.path: [/Users/leehyunjae/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2673) ~[na:na]
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830) ~[na:na]
at java.base/java.lang.System.loadLibrary(System.java:1873) ~[na:na]
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:391) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:161) ~[netty-common-4.1.78.Final.jar:4.1.78.Final]
... 127 common frames omitted
Suppressed: java.lang.UnsatisfiedLinkError: no netty_resolver_dns_native_macos_aarch_64 in java.library.path: [/Users/leehyunjae/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2673)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
at java.base/java.lang.System.loadLibrary(System.java:1873)
at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:425)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:417)
at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:383)
... 128 common frames omitted
libnetty_resolver_dns_native_macos_aarch_64.jnilib
파일이 없다고 하니 추가해주면 될 것 같다.
libnetty_resolver_dns_native_macos_aarch_64 의존성 추가 #
implementation("io.netty:netty-resolver-dns-native-macos:4.1.79.Final:osx-aarch_64")
의존성 추가 전
의존성 추가 후
참고 #
기본적으로 arm64
아키텍처의 경우, 다음과 같이 oxs-aarch_64
의존성이 추가되게끔 설정되어 있다.
...
if (!"$nettyVersion".endsWithAny("SNAPSHOT")) {
if (osdetector.classifier == "osx-x86_64" || osdetector.classifier == "osx-aarch_64") {
api "io.netty:netty-resolver-dns-native-macos:$nettyVersion$os_suffix"
}
else {
api "io.netty:netty-resolver-dns-native-macos:$nettyVersion:osx-x86_64"
}
}
else {
// MacOS binaries are not available for Netty SNAPSHOT version
api "io.netty:netty-resolver-dns-native-macos:$nettyVersion"
}
...
os_suffix
는 다음 코드에서 설정된다.
...
os_suffix = ""
if (osdetector.classifier in ["linux-x86_64"] || ["osx-x86_64"] || ["osx-aarch_64"] || ["windows-x86_64"]) {
os_suffix = ":" + osdetector.classifier
}
...
osdetector
osdetector.classifier
를 확인하면, osx-x86_64
값이 나온다.
= 즉, 아키텍처 디텍딩에서 오류
kr.motd.maven:os-maven-plugin:1.7.0
osdetector(google) -> os-maven-plugin (trustin)
...
protected void detect(Properties props, List<String> classifierWithLikes) {
log("------------------------------------------------------------------------");
log("Detecting the operating system and CPU architecture");
log("------------------------------------------------------------------------");
final String osName = systemPropertyOperationProvider.getSystemProperty("os.name");
final String osArch = systemPropertyOperationProvider.getSystemProperty("os.arch");
final String osVersion = systemPropertyOperationProvider.getSystemProperty("os.version");
...
}
...
private final class ConfigurationTimeSafeSystemPropertyOperations
implements SystemPropertyOperationProvider {
@Override
public String getSystemProperty(String name) {
return getProviderFactory().systemProperty(name).forUseAtConfigurationTime().getOrNull();
// getProviderFactory() : org.gradle.api.internal.provider.DefaultProviderFactory_Decorated@a046f6c
// getProviderFactory().systemProperty(name) : Provider<String> (DefaultValueSourceProviderFactory.NonConfigurationTimeProvider)
}
...
// DefaultValueSourceProviderFactory.class
public Provider<T> forUseAtConfigurationTime() {
return new ConfigurationTimeProvider(this.value);
}
// AbstractMinimalProvider.class
public T getOrNull() {
return this.calculateOwnValue(ValueConsumer.IgnoreUnsafeRead).orNull();
}
// DefaultValueSourceProviderFactory.class
protected ValueSupplier.Value<? extends T> calculateOwnValue(ValueSupplier.ValueConsumer consumer) {
this.vetoAtConfigurationTime();
return Value.ofNullable(this.value.obtain().get());
}
public Try<T> obtain() {
if (this.obtainValueForThe1stTime()) {
DefaultValueSourceProviderFactory.this.valueObtained(this.obtainedValue());
}
return this.value;
}
위 코드 진입 시 this.value(org.gradle.internal.Try) 설정된다.
DefaultProviderFactory
...
public Provider<String> systemProperty(Provider<String> propertyName) {
return this.of(SystemPropertyValueSource.class, (spec) -> {
((AbstractPropertyValueSource.Parameters)spec.getParameters()).getPropertyName().set(propertyName);
});
}
DefaultValueSourceProviderFactory
public abstract static class ValueSourceProvider<T, P extends ValueSourceParameters> extends AbstractMinimalProvider<T> {
protected final LazilyObtainedValue<T, P> value;
public ValueSourceProvider(LazilyObtainedValue<T, P> value) {
this.value = value; //
}
...
public ValueSupplier.ExecutionTimeValue<T> calculateExecutionTimeValue() {
return this.value.hasBeenObtained() ? ExecutionTimeValue.ofNullable(this.value.obtain().get()) : ExecutionTimeValue.changingValue(this);
}
protected ValueSupplier.Value<? extends T> calculateOwnValue(ValueSupplier.ValueConsumer consumer) {
this.vetoAtConfigurationTime();
return Value.ofNullable(this.value.obtain().get());
}
protected abstract void vetoAtConfigurationTime();
}
org.gradle.api.provider org.gradle.api.internal.provider
org.gradle.api.internal.provider.sources.SystemPropertyValueSource