apache-2.4.x 编译安装和升级版本方法

本文档详细介绍了如何在CentOS 7系统上编译安装Apache 2.4.x版本,包括准备依赖包、下载安装源码、编译安装过程以及将Apache的bin文件添加到环境变量的方法。此外,还提供了升级Apache的步骤,只需执行准备、下载和编译安装的步骤。

1,准备

系统:centos 7

依赖包:

        apr-1.6.5.tar.gz
        apr-util-1.6.5.tar.gz
        httpd-2.4.57.tar.gz
       gcc  pcre-devel  expat-devel libxml2-devel openssl-devel
2,下载安装包

wget https://dlcdn.apache.org//apr/apr-util-1.6.5.tar.gz
wget https://dlcdn.apache.org//apr/apr-1.6.5.tar.gz
wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz

wget https://dlcdn.apache.org//apr/apr-util-1.6.5.tar.gz
wget https://dlcdn.apache.org//apr/apr-1.6.5.tar.gz
wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz

3,编译安装

     yum update
     yum install gcc  pcre-devel openssl-devel expat-devel libxml2-devel -y

     tar zxf apr-1.6.5.tar.gz
     cd apr-1.6.5
     ./configure --prefix=/usr/local/apr   (--prefix指定apr安装的目录)
     make
     make  install

     tar 
<think>我们正在解决一个关于servlet-api-2.4.jar版本冲突的问题。在Java Web开发中,当多个模块或依赖项引入了不同版本的servlet-api时,可能会发生冲突。由于servlet-api是一个核心的Java EE(现在称为Jakarta EE)规范,通常由Servlet容器(如Tomcat)提供,因此在构建时我们通常将其标记为provided,以避免将servlet-api的jar包打包到最终的WAR文件中。 根据用户的问题,我们需要解决servlet-api-2.4.jar的冲突。可能的原因是项目直接或间接地依赖了servlet-api-2.4.jar,而我们的Servlet容器(如Tomcat 7+)通常提供的是更高版本的Servlet API(如3.0或更高)。因此,我们需要确保在构建时排除或标记该依赖为provided。 解决方案步骤: 1. 确定冲突来源:使用Maven或Gradle的依赖树分析工具,找出是哪个依赖引入了servlet-api-2.4.jar。 2. 排除依赖:在构建配置文件中排除该传递依赖。 3. 确保使用provided范围:在项目中显式声明servlet-api依赖,并将其范围设置为provided(这样就不会打包到WAR中,而是使用容器提供的API)。 假设用户使用Maven,我们可以这样操作: 步骤1:查看依赖树 在项目根目录下执行: ``` mvn dependency:tree ``` 查找servlet-api-2.4.jar的引入路径。 步骤2:排除传递依赖 假设我们发现是依赖A引入了servlet-api-2.4.jar,那么在pom.xml中对该依赖进行排除: ```xml <dependency> <groupId>groupA</groupId> <artifactId>artifactA</artifactId> <version>versionA</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> ``` 步骤3:显式声明servlet-api(可选,但推荐) 为了确保项目使用正确的Servlet API版本,我们可以显式声明servlet-api依赖,并设置scope为provided。注意:根据我们使用的Servlet容器版本,选择对应的API版本。例如,如果我们使用Tomcat 7,则对应Servlet 3.0: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <!-- 或者使用3.0,但注意2.42.5是兼容的,而3.0有较大变化 --> <scope>provided</scope> </dependency> ``` 注意:如果我们的项目需要Servlet 2.4的特性,那么使用2.5也是可以的,因为2.5是2.4的后续版本,保持兼容。但是,如果我们使用的是较新的容器(如Tomcat 9或10),则应该使用更高版本的Servlet API(如4.0),并相应地调整依赖。 另外,如果项目使用的是Gradle,解决方式类似: 步骤1:生成依赖树 ``` gradle dependencies ``` 步骤2:排除传递依赖 在build.gradle中: ```groovy dependencies { implementation('groupA:artifactA:versionA') { exclude group: 'javax.servlet', module: 'servlet-api' } } ``` 步骤3:声明provided依赖 在Gradle中,我们可以使用`providedCompile`(如果是War插件)或者使用`compileOnly`(推荐): ```groovy dependencies { compileOnly 'javax.servlet:servlet-api:2.5' } ``` 注意:在Gradle中,如果使用War插件,可以使用`providedCompile`,但新版本Gradle推荐使用`compileOnly`。 总结:解决servlet-api版本冲突的关键是排除项目中的直接或间接依赖,并将servlet-api设置为provided(或compileOnly),这样在编译测试时使用该依赖,但在运行时由Servlet容器提供。 另外,需要特别注意的是,Servlet API从2.5到3.0有较大的变化,如果我们的代码中使用了Servlet 3.0及以上版本的特有功能(如注解配置),那么就需要使用对应版本的API。但根据问题,我们处理的是2.4版本的冲突,因此使用2.5版本作为provided依赖通常是安全的,因为2.5是2.4的后续版本,保持了向后兼容。 如果项目中确实需要Servlet 2.4(例如,因为某些遗留代码),那么我们需要确保在构建时排除其他版本的servlet-api,并设置provided范围为2.4版本。但是,请注意,现代Servlet容器(如Tomcat 7+)通常不再提供2.4版本,因此可能需要使用较老的容器(如Tomcat 5.x或6.x)。因此,升级到更新的Servlet版本(如2.5或3.0)通常是更好的选择。 最后,如果用户使用的是其他构建工具,原理相同:排除传递依赖,并将servlet-api设置为由容器提供。 相关问题: 1. 如何确定Maven项目中某个依赖的引入路径? 2. 在Gradle中如何排除传递依赖? 3. 为什么在Java Web项目中要将servlet-api设置为provided? 4. Servlet API 2.42.5的主要区别是什么? 5. 如何升级项目以使用Servlet 3.0或更高版本?</think>### 解决 servlet-api-2.4.jar 版本冲突 在 Java Web 项目中,`servlet-api-2.4.jar` 的版本冲突通常是由于多个依赖引入了不同版本的 Servlet API 导致的。以下是系统化的解决方案: #### 1. **定位冲突来源** - **Maven 项目**:执行依赖分析命令: ```bash mvn dependency:tree -Dincludes=javax.servlet:servlet-api ``` 输出示例: ``` [INFO] com.example:demo:war:1.0 [INFO] +- org.legacy:old-module:jar:1.0 [INFO] | \- javax.servlet:servlet-api:jar:2.4:compile [INFO] \- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.50 [INFO] \- javax.servlet:javax.servlet-api:jar:4.0.1:provided ``` 这里 `old-module` 引入了冲突的 2.4 版本[^1]。 - **Gradle 项目**:使用命令: ```bash gradle dependencies --configuration runtimeClasspath | grep 'servlet-api' ``` #### 2. **排除旧版本依赖** 在构建文件中显式排除冲突版本: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.legacy</groupId> <artifactId>old-module</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> ``` ```groovy // Gradle 示例 implementation('org.legacy:old-module:1.0') { exclude group: 'javax.servlet', module: 'servlet-api' } ``` #### 3. **统一使用容器提供版本** Servlet API 应由服务器(如 Tomcat)提供,需确保: - 所有 Servlet API 依赖标记为 `provided`: ```xml <!-- Maven --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!-- 或与服务器匹配的版本 --> <scope>provided</scope> </dependency> ``` - 清理旧 JAR:检查项目的 `WEB-INF/lib` 目录,手动删除 `servlet-api-2.4.jar` #### 4. **验证解决方案** - 重新构建项目并检查依赖: ```bash mvn clean package && unzip -l target/*.war | grep 'servlet-api' ``` 应无任何 `servlet-api` JAR 被打包 - 运行时依赖由服务器提供(如 Tomcat 的 `lib/servlet-api.jar`) #### 5. **处理特殊情况** - **若必须使用 2.4 特性**:考虑升级项目,因为 Servlet 2.42003 年发布)已严重过时 - **非 Maven/Gradle 项目**:手动移除 `servlet-api-2.4.jar` 并配置构建路径 > **关键原则**:Servlet API 必须与服务器版本严格匹配,且**不应打包到 WAR 中**。现代服务器(如 Tomcat 9+)默认提供 Servlet 4.0+ API,强行使用 2.4 版本会导致类加载冲突[^1]。 --- ### 相关问题 1. 如何检查 Tomcat 提供的 Servlet API 版本2. Maven 依赖冲突的常用解决工具有哪些? 3. 升级 Servlet 2.4 项目到 Servlet 5.0+ 的主要挑战是什么? 4. 为什么 Servlet API 必须设置为 `provided` 作用域? 5. 如何解决非 Maven/Gradle 项目的 JAR 冲突问题? [^1]: 引用自 Spring Boot 整合 Flyway 的依赖管理示例,体现了作用域(scope)配置的重要性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值