一、环境准备二、源码包下载三、操作过程
1. 解压2. 构建apr库3. 构建openssl库4. 构建Tomcat Native库(dll文件)5. 编译6. 抽取关键文件7. 压缩打包 四、遇到的问题总结
本文主要参考 tomcat 官方文档 https://cwiki.apache.org/confluence/display/TOMCAT/Building+the+Tomcat+Native+Connector+binaries+for+Windows
一、环境准备
本篇文章是在 windows 环境下编译 tomcat-native ,请先安装如下:
Windows Server 2003 R2 Platform SDKWindows 7 SDKWindows DDK 7.1.0cmscJDK8perlC的编译工具(MinGW)Visual Studio 2008
注意:Visual Studio 2008 在安装时记得勾上C++里面的x64位编译器,默认不勾的
我也是按照 tomcat 官方这套版本编译成功的,其他版本的环境不确定
二、源码包下载openssl源码压缩包(openssl-OpenSSL_1_1_1k.zip)
https://github.com/openssl/openssl/tree/OpenSSL_1_1_1kapr源码压缩包(apr-1.7.0-win32-src.zip)
https://github.com/apache/apr/tree/1.7.0tomcat-native源码(tomcat-native-1.2.31-win32-src.zip)
https://dlcdn.apache.org/tomcat/tomcat-connectors/native/1.2.31/source/
在 windows 环境下编译 tomcat-native,其实是将 apr、openssl 用到的源码包编译进去,最终形成一个可调用的库文件 tcnative-1.dll
注意:这些源码包的版本号必须得到你的高度重视,后面编译的时候会指定这些版本号
三、操作过程 1. 解压将上面下载的三个源码包解压
将 apr-1.7.0-win32-src.zip 解压目录下所有东西复制到 tomcat-native 的 native/srclib/apr 下将 openssl-OpenSSL_1_1_1k.zip 解压目录下所有东西复制到 tomcat-native 的 native/srclib/openssl 下
注意:复制 apr、openssl 时不要带上最外层的目录,直接把里面的复制过去就好,目录不对后面运行会报错找不到
2. 构建apr库分别打开 Visual Studio 2008 和 Visual Studio 2008 x64 编译器命令窗口
注意:下面的命令,带 x64 的就用 Visual Studio 2008 x64 的命令窗口执行,否者报错
cd 进去 native/srclib/apr
nmake -f NMAKEmakefile BUILD_CPU=x86 APR_DECLARE_STATIC=1 nmake -f NMAKEmakefile BUILD_CPU=x64 APR_DECLARE_STATIC=13. 构建openssl库
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 appsopenssl.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 appsopenssl.exe out32-x644. 构建Tomcat Native库(dll文件)
cd 进去 native/srclib
注意:下面版本对应上你下载包的版本
set OPENSSL_VER=1.1.1k set APR_VER=1.7.0 mkdir deps-x86apr-%APR_VER%include mkdir deps-x86apr-%APR_VER%lib mkdir deps-x86openssl-%OPENSSL_VER%include mkdir deps-x86openssl-%OPENSSL_VER%lib xcopy /E deps-x86apr-%APR_VER% deps-x64apr-%APR_VER% xcopy /E deps-x86openssl-%OPENSSL_VER% deps-x64openssl-%OPENSSL_VER% xcopy /E aprinclude deps-x86apr-%APR_VER%include xcopy /E aprinclude deps-x64apr-%APR_VER%include copy aprWIN7_X86_LIB_RELEASEapr-1.lib deps-x86apr-%APR_VER%lib copy aprWIN7_X64_LIB_RELEASEapr-1.lib deps-x64apr-%APR_VER%lib xcopy /E opensslincludeopenssl deps-x86openssl-%OPENSSL_VER%includeopenssl xcopy /E opensslincludeopenssl deps-x64openssl-%OPENSSL_VER%includeopenssl copy opensslout32-x86*.lib deps-x86openssl-%OPENSSL_VER%lib copy opensslout32-x64*.lib deps-x64openssl-%OPENSSL_VER%lib copy opensslout32-x86openssl.exe deps-x86openssl-%OPENSSL_VER% copy opensslout32-x64openssl.exe deps-x64openssl-%OPENSSL_VER%
这时候你发现在该磁盘根目录下生成了 deps-x64、deps-x86 文件夹,里面有文件的
5. 编译cd … 也就是到 tomcat-native的native目录
注意:下面修成你自己 jdk 的目录
set JAVA_HOME=C:liqiyesoftwarejdk8 nmake -f NMAKEMakefile WITH_APR=C:deps-x86apr-%APR_VER% WITH_OPENSSL=C:deps-x86openssl-%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-x86apr-%APR_VER% WITH_OPENSSL=C:deps-x86openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x86 nmake -f NMAKEMakefile WITH_APR=C:deps-x64apr-%APR_VER% WITH_OPENSSL=C:deps-x64openssl-%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-x64apr-%APR_VER% WITH_OPENSSL=C:deps-x64openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x64
其实这时候我们要的目标文件 tcnative-1.dll 已经生成了
6. 抽取关键文件还是在 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-binLICENSE copy NOTICE.bin.win tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binNOTICE copy ..README.txt tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin copy srclibVERSIONS tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbin mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbinx64 copy C:deps-x86openssl-%OPENSSL_VER%openssl.exe tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbin xcopy /E tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin copy WIN7_X86_DLL_RELEASEtcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbin copy WIN7_X86_OCSP_DLL_RELEASEtcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-binbin copy WIN7_X86_DLL_RELEASEtcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbin copy WIN7_X86_OCSP_DLL_RELEASEtcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-binbin copy WIN7_X64_DLL_RELEASEtcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbinx64 copy WIN7_X64_OCSP_DLL_RELEASEtcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-binbinx64 copy WIN7_X64_DLL_RELEASEtcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-binbinx64 copy WIN7_X64_OCSP_DLL_RELEASEtcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-binbinx64
然后在 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目录VCinclude
复制%JAVA_HOME%includewin32下的jni_md.h 到Visual Studio目录VCinclude
换句话说,就是你安装的 Visual Studio ,他的 VC/include/ 目录下没有这两个文件,你去 jdk 下复制这两个文件过去就可以了
总结
欢迎指出我的错误!



