Tomcat打包时多项目共享jar和精确指定jar版本

简介: 在产品打包发布时一个tomcat中如果存在多个war,部署的一般方式是部署到%TOMCAT_HOME%/webapps目录下,目录结构遵循J2EE规范,把引用的jar放到%TOMCAT_HOME%/webapps/xxxxx.war/WEB-INF/lib下面即可。
在产品打包发布时一个tomcat中如果存在多个war,部署的一般方式是部署到%TOMCAT_HOME%/webapps目录下,目录结构遵循J2EE规范,把引用的jar放到%TOMCAT_HOME%/webapps/xxxxx.war/WEB-INF/lib下面即可。但是多个项目完全可能引用了相同的jar,如何使多项目共享这个jar呢?项目发布时经常由于jar冲突造成很多问题,如果使打出的包精确指定所需要的jar版本呢?如何不放到%TOMCAT_HOME%/webapps目录,而把war放到特定的位置如何加载呢呢?本文将解决以上几个问题。
    1.下载tomcat的zip包并解压,在%TOMCAT_HOME%/conf/Catalina/localhost文件夹下创建一个lkexample.xml文件,内容如下:
[html] view plaincopy
<?xml version="1.0" encoding="UTF-8"?>  
<Context docBase="../../apps/lk-example.war">  
    <Loader className="com.tgb.lk.example.dist.ManifestClasspathWebappLoader"/>  
</Context>  
2.将待部署的lk-example.war放到../../apps/lk-example.war下,并将lk-example.war/WEB-INF/lib下的所有jar剪接到../lib下,文件结构目录见下图
3.编写com.tgb.lk.example.dist.ManifestClasspathWebappLoader.java类并打包为jar
[java] view plaincopy
package com.tgb.lk.example.dist;  
   
import org.apache.catalina.Container;  
import org.apache.catalina.LifecycleException;  
import org.apache.catalina.core.StandardContext;  
import org.apache.catalina.loader.WebappLoader;  
   
import java.io.*;  
import java.util.jar.Attributes;  
import java.util.jar.Manifest;  
   
/** 
* 从War中的MANIFEST.MF获得类路径并进行额外加载 
*/  
public class ManifestClasspathWebappLoader extends WebappLoader {  
   
    public ManifestClasspathWebappLoader() {  
        super();  
    }  
   
   
    public ManifestClasspathWebappLoader(ClassLoader parent) {  
        super(parent);  
    }  
   
    @Override  
    protected void startInternal() throws LifecycleException {  
        final Container container = getContainer();  
        if (container instanceof StandardContext) {  
   
            File baseFile = new File(((StandardContext) container).getRealPath(""));  
   
            if (baseFile.exists() && baseFile.canRead()) {  //是否可读  
   
                if (baseFile.isDirectory()) {     //目录  
   
                    final File manifestFile = new File(baseFile, "META-INF/MANIFEST.MF");  
   
                    if (manifestFile.exists() && manifestFile.canRead() && manifestFile.isFile()) {     //MANIFEST.MF文件可读  
   
                        System.out.println("[DIST] found MANIFEST.MF" + manifestFile);  
   
                        try {  
                            FileInputStream fileInputStream = new FileInputStream(manifestFile);  
                            setClasspaths(baseFile, fileInputStream);  
   
                        } catch (FileNotFoundException e) {  
                            e.printStackTrace();  
                        }  
   
                    }  
   
                } else if (baseFile.isFile()) { //文件(war)  
   
                }  
   
            }  
        }  
   
        super.startInternal();  
    }  
   
    /** 
     * 设置MANIFEST.MF流中的类路径 
     * 
     * @param baseFile 
     * @param inputStream 
     */  
    private void setClasspaths(File baseFile, InputStream inputStream) {  
        String classpaths[] = null;  
        try {  
            final Manifest manifest = new Manifest(inputStream);  
            final Attributes attributes = manifest.getMainAttributes();  
            String classpathValue = attributes.getValue("Class-Path");  
            if (classpathValue != null) {          //可以不为null说明发现Class-Path  
                classpathValue = classpathValue.replaceAll("[\r\n]+$", ""); //移除换行  
                classpaths = classpathValue.split("\\s+");     //拆分类路径字符串  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
   
        if (classpaths != null) {   //如果发现类路径则设置类路径  
            for (String classpath : classpaths) {  
                addRepository(new File(baseFile.getParent(), classpath).toURI().toString());    //转换相对路径为实际路径并转换为URI  
            }  
            System.out.println("[DIST] " + baseFile.getName() + " append " + classpaths.length + " classpaths.");  
   
        }  
   
    }  
   
}  
4.将打出的jar包放到%TOMCAT_HONE%\lib下。
5.修改你的war工程的pom.xml,加入如下配置并运行mvn package命令:
[html] view plaincopy
<build>  
        <plugins>  
            <plugin>  
                <artifactId>maven-war-plugin</artifactId>  
                <configuration>  
                    <archive>  
                        <manifest>  
                            <addClasspath>true</addClasspath>  
                            <classpathPrefix>../lib/</classpathPrefix>  
                            <useUniqueVersions>false</useUniqueVersions>  
                        </manifest>  
                    </archive>  
                </configuration>  
            </plugin>  
        </plugins>  
    </build>  
观察打出的war包lk-example.war/META-INF/MANIFEST.MF文件,这个文件中打出了war精确引用的jar版本。如下图:
6.将打出的war包解压到apps目录文件下。
7.运行tomcat即可访问http://localhost:8080/lkexample。
 
    总结,修改%TOMCAT_HOME%/conf/Catalina/localhost/lkexample.xml指定了tomcat加载的应用以及加载应用时使用的webapp类加载器,通过自己重写的类加载器ManifestClasspathWebappLoader加载了xxxx.war/META-INF/MANIFEST.MF中精确的jar路径所引用的jar.如果发布的项目有多个war可以同时都指定引用lib下精确版本的jar文件,这样相同的jar就可以被多个项目使用。
若转载请注明出处!若有疑问,请回复交流!
目录
相关文章
|
2月前
|
Java 应用服务中间件
多项目分接口:在同一Tomcat下使用不同的端口号访问不同的项目。
总而言之,要在同一Tomcat服务器下使用不同端口访问不同项目,关键是通过对server.xml文件的配置创建多个 `<Service>`实例和相应的虚拟主机。这种方法既实现了项目隔离,也有助于优化资源利用率。通过遵循本文的详细说明,很容易地就能满足需求实现多项目分接口。
111 38
|
2月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
212 41
|
2月前
|
Java 应用服务中间件 Linux
Tomcat运行日志字符错乱/项目启动时控制台日志乱码问题
总结: 通过以上几种方法,概括如下:指定编码格式、设置JVM的文件编码、修改控制台输出编码、修正JSP页面编码和设置过滤器。遵循这些步骤,你可以依次排查和解决Tomcat运行日志字符错乱及项目启动时控制台日志乱码问题。希望这些建议能对你的问题提供有效的解决方案。
434 16
|
4月前
|
Java 应用服务中间件 API
Servlet开发流程 (里面有Idea项目添加Tomcat依赖详细教程)
本文详细介绍了Servlet的开发流程,包括在IntelliJ IDEA中添加Tomcat依赖的详细教程。通过上述步骤,开发者可以快速搭建并运行一个基本的Servlet应用,理解并掌握Servlet的开发流程对于Java Web开发至关重要。希望本文能够帮助开发者顺利进行Servlet开发,提高工作效率。
401 78
|
5月前
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
224 1
|
7月前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
1961 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
4月前
|
网络协议 Java 应用服务中间件
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
本文首先分享了《活出意义来》一书序言中的感悟,强调成功如同幸福,不是刻意追求就能得到,而是全心投入时的副产品。接着探讨了Tomcat的核心功能与架构解析,包括网络连接器(Connector)和Servlet容器(Container),并介绍了其处理HTTP请求的工作流程。文章还详细解释了Tomcat的server.xml配置文件,涵盖了从顶级容器Server到子组件Connector、Engine、Host、Context等的配置参数及作用,帮助读者理解Tomcat的内部机制和配置方法。
|
2月前
|
Java 应用服务中间件 Maven
在IntelliJ IDEA中如何配置使用Maven以创建Tomcat环境
所以,别担心这些工具看起来有些吓人,实际上这些都是为了帮助你更好的完成工作的工具,就像超市里的各种烹饪工具一样,尽管它们看起来可能很复杂,但只要你学会用,它们会为你烹饪出一道道美妙的食物。这就是学习新技能的乐趣,让我们一起享受这个过程,攀登知识的高峰!
214 27
|
2月前
|
Java 应用服务中间件 Apache
在IntelliJ IDEA中使用Maven配置Tomcat环境
此配置方法具有较高的实用性,简单易懂。遵循以上步骤,您将能顺利在IntelliJ IDEA中使用Maven配置Tomcat环境,从而进行Web项目的开发和调试。
202 18
|
2月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
187 11

热门文章

最新文章