本文主要参考 tomcat 官方文档 https://cwiki.apache.org/confluence/display/TOMCAT/Building+the+Tomcat+Native+Connector+binaries+for+Windows
本篇文章是在 windows 环境下编译 tomcat-native ,请先安装如下:
注意:Visual Studio 2008 在安装时记得勾上C++里面的x64位编译器,默认不勾的
我也是按照 tomcat 官方这套版本编译成功的,其他版本的环境不确定
在 windows 环境下编译 tomcat-native,其实是将 apr、openssl 用到的源码包编译进去,最终形成一个可调用的库文件 tcnative-1.dll
注意:这些源码包的版本号必须得到你的高度重视,后面编译的时候会指定这些版本号
将上面下载的三个源码包解压
注意:复制 apr、openssl 时不要带上最外层的目录,直接把里面的复制过去就好,目录不对后面运行会报错找不到
分别用 Visual Studio 2008 和 Visual Studio 2008 x64 编译器命令窗口执行下面的命令
注意:下面的命令,带 x64 的就用 Visual Studio 2008 x64 的命令窗口执行,带x86的就用 Visual Studio 2008 执行
先执行完 x86 的再去执行 x64 的,如果中途关闭了 Visual Studio 2008 的窗口,要再次输入下面的 SET 参数的命令
cd 进去 native/srclib/apr
nmake -f NMAKEmakefile BUILD_CPU=x86 APR_DECLARE_STATIC=1
nmake -f NMAKEmakefile BUILD_CPU=x64 APR_DECLARE_STATIC=1
cd 进去 native/srclib/openssl
构建32位的库文件
perl Configure no-shared VC-WIN32
nmake
mkdir out32-x86
copy libssl.lib out32-x86\
copy libcrypto.lib out32-x86\
copy apps\openssl.exe out32-x86\
nmake clean
构建64位的库文件
perl Configure no-shared VC-WIN64A
nmake
mkdir out32-x64
copy libssl.lib out32-x64\
copy libcrypto.lib out32-x64\
copy apps\openssl.exe out32-x64\
cd 进去 native/srclib
注意:下面版本对应上你下载包的版本
set OPENSSL_VER=1.1.1k
set APR_VER=1.7.0
mkdir \deps-x86\apr-%APR_VER%\include
mkdir \deps-x86\apr-%APR_VER%\lib
mkdir \deps-x86\openssl-%OPENSSL_VER%\include
mkdir \deps-x86\openssl-%OPENSSL_VER%\lib
xcopy /E \deps-x86\apr-%APR_VER% \deps-x64\apr-%APR_VER%\
xcopy /E \deps-x86\openssl-%OPENSSL_VER% \deps-x64\openssl-%OPENSSL_VER%\
xcopy /E apr\include \deps-x86\apr-%APR_VER%\include\
xcopy /E apr\include \deps-x64\apr-%APR_VER%\include\
copy apr\WIN7_X86_LIB_RELEASE\apr-1.lib \deps-x86\apr-%APR_VER%\lib
copy apr\WIN7_X64_LIB_RELEASE\apr-1.lib \deps-x64\apr-%APR_VER%\lib
xcopy /E openssl\include\openssl \deps-x86\openssl-%OPENSSL_VER%\include\openssl\
xcopy /E openssl\include\openssl \deps-x64\openssl-%OPENSSL_VER%\include\openssl\
copy openssl\out32-x86\*.lib \deps-x86\openssl-%OPENSSL_VER%\lib\
copy openssl\out32-x64\*.lib \deps-x64\openssl-%OPENSSL_VER%\lib\
copy openssl\out32-x86\openssl.exe \deps-x86\openssl-%OPENSSL_VER%\
copy openssl\out32-x64\openssl.exe \deps-x64\openssl-%OPENSSL_VER%\
这时候你发现在该磁盘根目录下生成了 deps-x64、deps-x86 文件夹,里面有文件的
返回上天一层, 也就是到 tomcat-native的native目录
注意:下面修成你自己 jdk 的目录
set JAVA_HOME=C:\liqiye\software\jdk8
nmake -f NMAKEMakefile WITH_APR=C:\deps-x86\apr-%APR_VER% WITH_OPENSSL=C:\deps-x86\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 ENABLE_OCSP=1 BUILD_CPU=x86
move WIN7_X86_DLL_RELEASE WIN7_X86_OCSP_DLL_RELEASE
nmake -f NMAKEMakefile WITH_APR=C:\deps-x86\apr-%APR_VER% WITH_OPENSSL=C:\deps-x86\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x86
nmake -f NMAKEMakefile WITH_APR=C:\deps-x64\apr-%APR_VER% WITH_OPENSSL=C:\deps-x64\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 ENABLE_OCSP=1 BUILD_CPU=x64
move WIN7_X64_DLL_RELEASE WIN7_X64_OCSP_DLL_RELEASE
nmake -f NMAKEMakefile WITH_APR=C:\deps-x64\apr-%APR_VER% WITH_OPENSSL=C:\deps-x64\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x64
其实这时候我们要的目标文件 tcnative-1.dll 已经生成了
还是在 tomcat-native的 native 目录下
set VER=1.2.31
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin
copy LICENSE.bin.win tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\LICENSE
copy NOTICE.bin.win tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\NOTICE
copy ..\README.txt tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\
copy srclib\VERSIONS tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy C:\deps-x86\openssl-%OPENSSL_VER%\openssl.exe tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
xcopy /E tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\
copy WIN7_X86_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
copy WIN7_X86_OCSP_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin
copy WIN7_X86_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
copy WIN7_X86_OCSP_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin
copy WIN7_X64_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy WIN7_X64_OCSP_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin\x64
copy WIN7_X64_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy WIN7_X64_OCSP_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin\x64
然后在 tomcat-native 的 native 目录下出现以下两个目录
tomcat-native-1.2.31-openssl-1.1.1k-win32-bin
tomcat-native-1.2.31-openssl-1.1.1k-ocsp-win32-bin
还是在 tomcat-native的 native 目录下
set PATH=%PATH%;%JAVA_HOME%\bin
cd tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin
jar -cMf ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin.zip *
cd ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin
jar -cMf ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin.zip *
然后在 tomcat-native 的 native 目录下有了两个压缩包,他们跟官网下载的编译后的包是一样的
到这里已经完成在 windows 下将 tomcat-native 源码编译成 dll 文件了
如果上面编译过程中,报错 fatal error C1083: 无 法打开包括文件:“jni.h”: No such file or directory
解决办法:
复制%JAVA_HOME%\include\下的 jni.h 到Visual Studio目录\VC\include
复制%JAVA_HOME%\include\win32\下的jni_md.h 到Visual Studio目录\VC\include\
换句话说,就是你安装的 Visual Studio ,他的 VC/include/ 目录下没有这两个文件,你去 jdk 下复制这两个文件过去就可以了
欢迎指出我的错误!