From 6c1af9036fd2be2d3a943734f101c5643a21453e Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Thu, 1 May 2014 19:26:51 +0900 Subject: [PATCH] Simplify native library resolution using os-maven-plugin Motivation: So far, we used a very simple platform string such as linux64 and linux32. However, this is far from perfection because it does not include anything about the CPU architecture. Also, the current build tries to put multiple versions of .so files into a single JAR. This doesn't work very well when we have to ship for many different platforms. Think about shipping .so/.dynlib files for both Linux and Mac OS X. Modification: - Use os-maven-plugin as an extension to determine the current OS and CPU architecture reliable at build time - Use Maven classifier instead of trying to put all shared libraries into a single JAR - NativeLibraryLoader does not guess the OS and bit mode anymore and it always looks for the same location regardless of platform, because the Maven classifier does the job instead. Result: Better scalable native library deployment and retrieval --- .../util/internal/NativeLibraryLoader.java | 20 +------- pom.xml | 13 +++++ transport-native-epoll/pom.xml | 50 ++++++------------- .../src/main/native-package/m4/custom.m4 | 47 ----------------- 4 files changed, 30 insertions(+), 100 deletions(-) delete mode 100644 transport-native-epoll/src/main/native-package/m4/custom.m4 diff --git a/common/src/main/java/io/netty/util/internal/NativeLibraryLoader.java b/common/src/main/java/io/netty/util/internal/NativeLibraryLoader.java index b0b7244989..d691dfb5a1 100644 --- a/common/src/main/java/io/netty/util/internal/NativeLibraryLoader.java +++ b/common/src/main/java/io/netty/util/internal/NativeLibraryLoader.java @@ -24,8 +24,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; -import java.util.Locale; -import java.util.regex.Pattern; /** * Helper class to load JNI resources. @@ -35,7 +33,6 @@ public final class NativeLibraryLoader { private static final InternalLogger logger = InternalLoggerFactory.getInstance(NativeLibraryLoader.class); - private static final Pattern REPLACE = Pattern.compile("\\W+"); private static final File WORKDIR; static { @@ -67,7 +64,7 @@ public final class NativeLibraryLoader { */ public static void load(String name, ClassLoader loader) { String libname = System.mapLibraryName(name); - String path = "META-INF/native/" + osIdentifier() + PlatformDependent.bitMode() + '/' + libname; + String path = "META-INF/native/" + libname; URL url = loader.getResource(path); if (url == null) { @@ -128,21 +125,6 @@ public final class NativeLibraryLoader { } } - private static String osIdentifier() { - String name = SystemPropertyUtil.get("os.name", "unknown").toLowerCase(Locale.US).trim(); - if (name.startsWith("win")) { - return "windows"; - } - if (name.startsWith("mac os x")) { - return "osx"; - } - if (name.startsWith("linux")) { - return "linux"; - } - - return REPLACE.matcher(name).replaceAll("_"); - } - private NativeLibraryLoader() { // Utility } diff --git a/pom.xml b/pom.xml index 8423c1df47..5383e28a71 100644 --- a/pom.xml +++ b/pom.xml @@ -362,6 +362,14 @@ + + + kr.motd.maven + os-maven-plugin + 1.1.1 + + + maven-enforcer-plugin @@ -805,6 +813,11 @@ exec-maven-plugin 1.2.1 + + org.fusesource.hawtjni + maven-hawtjni-plugin + 1.10 + diff --git a/transport-native-epoll/pom.xml b/transport-native-epoll/pom.xml index b9aa83d462..cb6699ff7c 100644 --- a/transport-native-epoll/pom.xml +++ b/transport-native-epoll/pom.xml @@ -60,39 +60,16 @@ org.fusesource.hawtjni maven-hawtjni-plugin - 1.10 - build-linux64 + build-native-lib - ${project.artifactId} - ${project.build.directory}/linux64 - ${nativeSourceDirectory} - ${libDirectory} - - --with-arch=x86_64 - - linux64 - true - true - - - generate - build - - compile - - - build-linux32 - - ${project.build.directory}/linux32 - ${nativeSourceDirectory} - ${libDirectory} - ${project.artifactId} - - --with-arch=i386 - - linux32 + ${project.basedir}/src/main/c + ${project.build.outputDirectory} + + . true true @@ -104,10 +81,15 @@ + + + + maven-jar-plugin + + ${os.detected.classifier} + + - - ${basedir}/src/main/c - ${basedir}/target/classes/ - + diff --git a/transport-native-epoll/src/main/native-package/m4/custom.m4 b/transport-native-epoll/src/main/native-package/m4/custom.m4 deleted file mode 100644 index c3ffe7d167..0000000000 --- a/transport-native-epoll/src/main/native-package/m4/custom.m4 +++ /dev/null @@ -1,47 +0,0 @@ -dnl --------------------------------------------------------------------------- -dnl Copyright 2014 The Netty Project -dnl -dnl Licensed under the Apache License, Version 2.0 (the "License"); -dnl you may not use this file except in compliance with the License. -dnl You may obtain a copy of the License at -dnl -dnl http://www.apache.org/licenses/LICENSE-2.0 -dnl -dnl Unless required by applicable law or agreed to in writing, software -dnl distributed under the License is distributed on an "AS IS" BASIS, -dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -dnl See the License for the specific language governing permissions and -dnl limitations under the License. -dnl --------------------------------------------------------------------------- - -AC_DEFUN([CUSTOM_M4_SETUP], -[ - AC_MSG_CHECKING(which arch to build for) - AC_ARG_WITH([arch], - [AS_HELP_STRING([--with-arch@<:@=ARCH@:>@], - [Build for the specified architecture. Pick from: i386, x86_64.])], - [ - AS_IF(test -n "$withval", [ - ARCH="$withval" - AC_MSG_RESULT([yes, archs: $ARCH]) - ]) - ],[ - ARCH="" - AC_MSG_RESULT([no]) - ]) - AS_IF(test "$ARCH" = "i386", [ - FLAGS="-m32" - ], test "ARCH" = "x86_64", [ - FLAGS="-m64" - ], [ - FLAGS="" - ]) - AS_IF(test -n "$FLAGS", [ - CFLAGS="$FLAGS $CFLAGS" - CXXFLAGS="$FLAGS $CXXFLAGS" - LDFLAGS="$FLAGS $ARCH $LDFLAGS" - AC_SUBST(CFLAGS) - AC_SUBST(CXXFLAGS) - AC_SUBST(LDFLAGS) - ]) -]) \ No newline at end of file