精华内容
下载资源
问答
  • 在工作中碰到一比较苦恼的事情,(这里以7条线为例子)同一个war包 需要部署7条生产线,但是每生产线的编号以及ip都不同,导致我们手动的每个包替换配置文件和配 置ip的js文件 并且每次发布,还需要手动去...

       在工作中碰到一个比较苦恼的事情,(这里以7条线为例子)同一个war包 需要部署7条生产线,但是每个生产线的编号以及ip都不同,导致我们手动的每个包去替换配置文件和配           置ip的js文件

            并且每次发布,还需要手动去修改配置文件里面的版本号,这样十分的繁琐。因此该小程序实现对同一个war包进行自动替换里面的配置和js文件加入相关的版本号,

            生成对应的7个war,可以减少很多的时间成本。

           此功能配合jenkis 自动部署 生成的war目录,即tomcat/webapps的目录下  xxx.war (jenkis 自动化部署下章在做笔记) ,使用该程序自动生成的war  1.war、2.war ...

            7条线别对应的配置 以及js文件 在当前项目里面创建好。

      原理很简单:原有的war包,复制7份并且替换包里面的配置文件以及js文件。

    一、项目resources 下面创建文件夹 如下面的7条线,每条线对应的propertie 和 js 文件都不一样(此项目是前后端分离的)

       

    二、加入压缩和解压缩工具类

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Iterator;
    
    import org.apache.commons.compress.archivers.ArchiveException;
    import org.apache.commons.compress.archivers.ArchiveInputStream;
    import org.apache.commons.compress.archivers.ArchiveOutputStream;
    import org.apache.commons.compress.archivers.ArchiveStreamFactory;
    import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
    import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
    import org.apache.commons.compress.utils.IOUtils;
    import org.apache.commons.io.FileUtils;
    
    /**
     * 处理WAR文件工具类。可压缩或解压缩WAR文件。
     * 
     * @author Xiong Shuhong(shelltea@gmail.com)
     */
    public class DeCompressUtil {
        public static void unzip(String warPath, String unzipPath) {
            File warFile = new File(warPath);
            try {
                BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(warFile));
                ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.JAR,
                        bufferedInputStream);
    
                JarArchiveEntry entry = null;
                while ((entry = (JarArchiveEntry) in.getNextEntry()) != null) {
                    if (entry.isDirectory()) {
                        new File(unzipPath, entry.getName()).mkdir();
                    } else {
                        OutputStream out = FileUtils.openOutputStream(new File(unzipPath, entry.getName()));
                        IOUtils.copy(in, out);
                        out.close();
                    }
                }
                in.close();
            } catch (FileNotFoundException e) {
                System.err.println("未找到war文件");
            } catch (ArchiveException e) {
                System.err.println("不支持的压缩格式");
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println("文件写入发生错误");
            }
        }
    
        public static void zip(String destFile, String zipDir) {
            File outFile = new File(destFile);
            try {
                outFile.createNewFile();
                BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outFile));
                ArchiveOutputStream out = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.JAR,
                        bufferedOutputStream);
    
                if (zipDir.charAt(zipDir.length() - 1) != '/') {
                    zipDir += '/';
                }
    
                Iterator<File> files = FileUtils.iterateFiles(new File(zipDir), null, true);
                while (files.hasNext()) {
                    File file = files.next();
                    ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, file.getPath().replace(
                            zipDir.replace("/", "\\"), ""));
                    out.putArchiveEntry(zipArchiveEntry);
                    IOUtils.copy(new FileInputStream(file), out);
                    out.closeArchiveEntry();
                }
                out.finish();
                out.close();
            } catch (IOException e) {
                System.err.println("创建文件失败");
            } catch (ArchiveException e) {
                System.err.println("不支持的压缩格式");
            }
        }
    }

    三、加入文件读写工具类

    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    /**
     * java读写文件,复制文件
     * 读取d:/1.txt文件内容,写入f:/text.txt文件中.
     * @author young
     *
     */
    public class FileUtil {
        // 读写文件
        public static void copyFile(InputStream targetInputStream, String destFile){
            FileWriter fw = null;
            BufferedReader br = null;
            try {
                fw = new FileWriter(destFile, false);
                br = new BufferedReader(new InputStreamReader(targetInputStream));
                String line = null;
                while ((line = br.readLine()) != null) {
                    fw.write(line + "\n");
                    fw.flush();
                }
                br.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fw != null) {
                    try {
                        fw.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        
        // 读写文件
        public static void appendFile(String appendContent, String destFile){
            FileWriter fw = null;
            if(appendContent != null) {
                try {
                    fw = new FileWriter(destFile, true);
                    fw.write(appendContent + "\n");
                    fw.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fw != null) {
                        try {
                            fw.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    四、该程序的配置文件

      配置文件只有源目录 和 目标目录

    五、替换目标文件业务代码 (代码里面有详细的注释)

     

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    import com.hxzhishi.odf.pcp.utils.DeCompressUtil;
    import com.hxzhishi.odf.pcp.utils.FileUtil;
    
    
    
    public class Main {
        
        //打包源文件路径
        private static String sourceFilePath;
        
        //打包源文件路径
        private static String replaceFilePath;
        
        private static void readProperties() {
            Properties properties = new Properties();
            // 使用ClassLoader加载properties配置文件生成对应的输入流
            InputStream in = Main.class.getClassLoader().getResourceAsStream("application.properties");
            // 使用properties对象加载输入流
            try {
                properties.load(in);
                //获取key对应的value值
                sourceFilePath = properties.getProperty("app.target.file.path");
                replaceFilePath = properties.getProperty("app.replace.file.path");
            } catch (IOException e) {
                System.out.println(e.getMessage());    
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        /**
         * 获得pc的版本号
         * @param sourceFile
         * @return
         */
        private static String getPcVersion(String sourceFile) {
            String pcVersion = null;
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader(sourceFile));
                String line = null;
                while((line = br.readLine()) != null) {
                    if(line.indexOf("version") >= 0) {  //从原始的war里面获取版本号
                        pcVersion = line;
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("获取version信息失败.");
            } finally {
                if(br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            return pcVersion;
        }
        
        public static void main(String[] args) {
            //1. 读取配置信息
            readProperties();
            String sourcePath = sourceFilePath;
            File file = new File(sourcePath);
            //2. 获取version信息
            String pcVersion = getPcVersion(sourcePath + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + "application.properties");
            if(file.exists()) {
                if(file.isDirectory()) {
                    File replaceFilesFold = new File(replaceFilePath);
                    if(replaceFilesFold.exists() && replaceFilesFold.isDirectory()) {
                        File[] companyFoldArr = replaceFilesFold.listFiles();
                        if(companyFoldArr != null && companyFoldArr.length > 0) {
                            for(File companyFold : companyFoldArr) {
                                if(companyFold.isDirectory() && companyFold.getName().indexOf("svn") < 0) {//公司名称
                                    File[] factoryFoldArr = companyFold.listFiles();
                                    if(factoryFoldArr != null && factoryFoldArr.length > 0) {
                                        for(File factoryFold : factoryFoldArr) {
                                            if(factoryFold.isDirectory() && factoryFold.getName().indexOf("svn") < 0) {//工厂名称
                                                File[] lineFoldArr = factoryFold.listFiles();
                                                if(lineFoldArr != null && lineFoldArr.length > 0) {
                                                    for(File lineFold : lineFoldArr) {
                                                        if(lineFold.isDirectory() && lineFold.getName().indexOf("svn") < 0) {//线别名称
                                                            String fileName = companyFold.getName() + factoryFold.getName() + lineFold.getName() + ".war";
                                                            File[] replaceFileArr = lineFold.listFiles();
                                                            if(replaceFileArr != null && replaceFileArr.length >= 2) {
                                                                boolean isFailure = false;
                                                                for(File replaceFile : replaceFileArr) {
                                                                    if("application.properties".equals(replaceFile.getName())) {
                                                                        try {
                                                                            InputStream inputStream = new FileInputStream(replaceFile);
                                                                            String destFile = sourcePath + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + "application.properties";
                                                                            FileUtil.copyFile(inputStream, destFile);
                                                                            FileUtil.appendFile(pcVersion, destFile);
                                                                        } catch (FileNotFoundException e) {
                                                                            e.printStackTrace();
                                                                            System.out.println(replaceFile.getAbsolutePath() + "文件读取失败.");
                                                                            isFailure = true;
                                                                        }
                                                                    }
                                                                    if("window-global.js".equals(replaceFile.getName())) {
                                                                        try {
                                                                            InputStream inputStream = new FileInputStream(replaceFile);
                                                                            FileUtil.copyFile(inputStream, sourcePath + File.separator + "static" + File.separator + "js" + File.separator + "window-global.js");
                                                                        } catch (FileNotFoundException e) {
                                                                            e.printStackTrace();
                                                                            System.out.println(replaceFile.getAbsolutePath() + "文件读取失败.");
                                                                            isFailure = true;
                                                                        }
                                                                    }
                                                                }
                                                                if(!isFailure) {//打包
                                                                    generateLineWar(sourcePath, fileName);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else {
                    System.out.println("源目录不是一个目录.");    
                }
            } else {
                System.out.println("源目录不存在.");    
            }
            System.out.println("打包结束");
        }
        
        /**
         * 生产打包文件
         * @param sourcePath
         * @param fileName
         */
        private static void generateLineWar(String sourcePath, String fileName) {
            try {
                DeCompressUtil.zip(fileName, sourcePath);
                System.out.println(fileName + "文件生成成功.");
            } catch (Exception e) {
                System.out.println(fileName + "文件解压失败.");
                e.printStackTrace();
            }
        }
    }

     

     六、把此程序放到tomcat下面 当jenkis 重新编译的时候 便会生成7个对应的war包 包名就是生产线的名称 防止拿错包。

     

    转载于:https://www.cnblogs.com/citime/p/10059737.html

    展开全文
  • 近日修复了一网页展示数据的bug,但是上线后出现一奇怪的... 1、项目是以war包的形式部署在weblogic中的,上线时是做了war包替换,weblogic并不会重启。由于项目在运行期间开启了线程跑任务(该线程处理的数据...

           

    目录

    一、出现原因:

    二、排查过程


            近日修复了一个网页展示数据的bug,但是上线后出现一个奇怪的现象,表现形式是在刷新相关网页的时候会有两种情况:一种情况是网页展示的数据为未修复bug前的数据,另一种情况是网页展示的数据为修复bug后的数据。如果不停的刷新,会发现页面会是这两种情况随机出现。下面讲解问题出现的原因及排查过程。

     

    一、出现原因:

            1、项目是以war包的形式部署在weblogic中的,上线时是做了war包替换,weblogic并不会重启。由于项目在运行期间开启了线程跑任务(该线程处理的数据就是网页要展示的数据,而前文提到的bug就是在这里做的修改),并在war包停止时没能正确的关闭该线程,导致旧war包下线后该任务仍在后台运行。而此时新的war包上线后又开启的了新的线程跑任务,最终导致了服务器的新旧任务都在跑,表现在网页上就是一会获得的数据是旧任务跑出来的,一会又是新任务跑出来的,即bug的出现:两种页面表现交替出现。这个bug出现让我认识到自己技术的一个盲点:war包停止后它开启的deamon线程并不会自动终止(需war包的web容器仍在运行)。我推测会出现这样的现象是因为war包是部署在weblogic上的,其实我们的war包开启的线程真正的父线程是weblogic,只要weblogic不关闭,那么它的deamon子线程自然能够继续存在。

             2、代码里有关闭线程的操作,为什么没有关闭线程?

            以下是该任务的简练代码

    package xxx.xxx;
    
    import org.apache.ibatis.reflection.ExceptionUtil;
    import org.apache.tomcat.util.ExceptionUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    import java.util.concurrent.TimeUnit;
    
    
    @Component
    public class TaskThread extends Thread implements InitializingBean, DisposableBean {
    
        private final Logger logger = LoggerFactory.getLogger(TaskThread.class);
    
        @Override
        public void afterPropertiesSet() throws Exception {
            this.start();
        }
    
        @Override
        public void run() {
            while(!this.isInterrupted()) {
                try {
                    // ...业务代码,原代码省略,代码中主要是较多的数据库查询操作
                    new OtherObject.execute();
                } catch (Throwable e) {
                    logger.error("定时任务异常:" + e.getMessage());
                }
                try {
                    TimeUnit.MINUTES.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    
        @Override
        @SuppressWarnings("deprecation")
        public void destroy() {
            logger.debug(Thread.currentThread().getName() + "TaskThread has end!");
            this.interrupt();
        }
    }
    

            想要看懂bug产生的原因,需要先了解Thread类两个方法的使用:1、isInterrupted,2、interrutp。

             isInterrupted方法的作用是获取线程的中断标志。

            interrutp方法的作用是设置线程的中断标志,需要注意的是如果线程处于正常的运行状态,那么调用interrutp方法并不会起到直接的作用,想要退出线程需要我们在代码中主动调用isInterrupted方法判断线程的中断标志然后手动退出。而这种非强行中断线程的提出机制的好处就是避免了强行中断线程会导致的锁、资源等的不能正常释放导致的其他问题。而如果你的线程正处于调用sleep、wait等函数的阻塞状态时,调用该方法时会导致sleep、wait处抛出一个InterruptedException异常,并且会将中断标志复位(如果你先调用了该方法,再去调用sleep、wait,那么现象也是一样的)。而这也是产生这个bug的原因。

           接下来再来看代码,该代码比较简单,容器启动的时候开启线程执行任务,任务两分钟执行一次。在容器退出时调用interrupt方法通知线程退出。在run方法里边的while循环里有this.isInterrupted()判断退出条件。乍一看发现代码写的并没有问题,后来通过排查发现问题出现在第一个catch里,由于实际的任务有多个子任务,这里不希望某一个子任务抛异常导致线程退出,所以所有的异常都捕获并终止往上抛出。在try代码块里的业务代码里会有大量的数据库查询,数据库查询使用mybatis框架,底层的连接池使用是c3p0。通过debug,我们发现了在发出中断标志后,有一定的几率在第一个catch代码块中捕获MyBatisSystemException异常,仔细一看这个异常的Cause信息,发现正是InterruptedException异常。定位到抛出异常的代码位置,可以看到在c3p0的jar包BaseResourcePool的1315行有这样的一行代码:this.wait(timeout)

            看到这里我们已经找到了问题产生的真正的原因了:在项目上线时先停止旧的war包,此时触发我们任务类的destroy方法,调用线程的interrutp去设置中断标志。而如果此时任务正在执行,那么大量的sql查询有一定几率执行触发c3p0的wait代码,我们前文讲过在设置中断标志后调用wait会抛出InterruptedException异常并重置中断标志。这个InterruptedException异常经过包装后被我们自己的代码中第一个catch块捕获,并且块中的代码只是打印日志没有其他操作,导致我们的线程没能通过异常退出,而此时线程的中断标志已经被重置,代码中 while(!this.isInterrupted())也不能按照计划中断退出,导致这个线程永远也不会再有机会退出了,从而引进前文描述的问题。

            既然问题产生的原因找到了,那么解决起来就容易了。首先是临时的解决办法:重启weblogic,通过重启weblogic杀掉旧线程。然后是永久的解决办法:在类中加表示线程中断的布尔变量,用该变量代替使用Thread类的interrutp、isInterrupted来控制进程的退出。其实还有一种修改的方法,就是在一个cathc块中判处异常的类型是否是InterruptedException,如果是的话就把异常跑出去。但是这样做有两个问题,一是在业务代码使用的某些框架底层代码可能会捕获该异常,并且抛出一个其他异常。二是如果有后来的开发人员不清楚相关的机制,在业务代码中有显式的调用sleep或者wait,那么异常也可能抛不出来。

     

    二、排查过程

            接下来将详细的讲解这次排查生产问题的过程。

            在问题出现的时候,首先想到的是两种可能。一种是在上线时集群中有的机器被漏掉了,没有部署新的war包。我们项目集群中有8台机器,如果有漏掉的机器那么就肯定会出现这种生产问题。但是联系运维排查,发现8台机器的war包文件时间都是最新的,那么首先排除掉这种可能。第二种就是还有我们不知道的地方运行着旧代码,而本次上线没有跟着上线。因为实际上这次上线的功能是定时从数据库查询数据并存放到redis中(缓存reload机制),后续客户查询的数据都是从redis取的,如果有这样的地方运行着旧代码,那么旧代码和新代码就会轮流着更新redis缓存,导致缓存中的数据一会是错误的一会是正确的,而客户查询数据的时候就会发现如果不停刷新页面,页面的数据会是两种数据来回的展示。然后我们一想,还真有其他地方也部署着我们项目的war包,当时这个war包是专门用来支持一个新的业务的,在原本的设想中这个war包就一直不动了。但是现在看来因为和我们的项目共用一个redis缓存,那么这次上线必须得让这个疏漏的地方也上新的war包。本来以为问题查到这里已经解决了,但是在又一次上线war后发现问题仍然存在。

            接下来我们查询war包的日志,定位到这次上线修改的sql上,吃惊的发现这条sql在日志中一会是修改前的写法,一会又是修改后的写法,而且查了几台服务器,发现有的服务器会出现这样的现象,有的服务器却不会出现这种现象。而从这个现象我们首先能判断出是旧包下线的时候开启的线程仍在运行中,从而导致了这个问题。如果我们的推测是正确的,那么重启weblogic把旧war包的线程杀掉就能暂时解决这次问题,我们实际也这样做了,发现生产上的网页确实没有问题了。接下来就是分析为什么这个线程没有退出了,这个原因在前文已经讲过了,这里就不再赘述了。而前文也讲过,出现bug的时机是线程正在执行业务代码的时候,如果线程正在睡眠就不会有问题,这也就导致了有的机器上发现日志有问题,而有的机器上日志却没有问题。

            那么文章到这里就结束了,希望能给碰到类似问题而在网上苦苦搜索的朋友提供到帮助。

     

     

     

    展开全文
  • 1.如果要替换文件直接在war包的根目录(一级目录)下,直接使用jaruvf命令替换即可 如:替换a.war中b.xml文件 jar uvf a.war b.xml 注:b.xml需要和a.war在同一目录下。 2.如果要替换文件war包的二级及...

    1.如果要替换的文件直接在war包的根目录(一级目录)下,直接使用jar uvf命令替换即可

    如:替换a.war中b.xml文件

        jar uvf a.war b.xml

    注:b.xml需要和a.war在同一个目录下。

    2.如果要替换的文件在war包的二级及以下目录下,则需要以下步骤:

    (1)使用jar tvf war名称 | grep 目标文件名 查询出目标文件在war包中的目录

    (2)使用jar xvf war名称 目标文件名(copy上面查出的全路径) 将目标文件及所在war包中的目录解压到当前路径

    (3)修改目标文件的内容,或者将要新的目标文件替换掉提取出来的目标文件

    (4)使用jar uvf war名称 目标文件名(和步骤(2)中的目标文件名相同) 将新目标文件替换到war包中

    举例:替换SpringJMS04031240.war包中的ZcjdService.class,ZcjdService$1.class文件

    (1)# jar -tvf SpringJMS04031240.war |grepZcjdService

    (2)# jar -xvf SpringJMS04031240.war WEB-INF/classes/com/inspur/service/ZcjdService.class
      

    (3)# cp ZcjdService.class WEB-INF/classes/com/inspur/service/
      cp:是否覆盖"WEB-INF/classes/com/inspur/service/ZcjdService.class"? yes

    (4)# jar -uvf SpringJMS04031240.war WEB-INF/classes/com/inspur/service
      正在添加: WEB-INF/classes/com/inspur/service/ZcjdService.class(输入 = 4426) (输出 = 1892)(压缩了 57%)

    展开全文
  • 使用jar打war包或解压war包

    千次阅读 2019-06-10 16:27:09
    今天别的部门的同事传来一个包,说叫解压替换Java项目下的目录即可 我拿到了手,一看NM这怎么解压,不是通常的那种压缩格式,遂立马百度,来弥补一C++程序员受伤的心灵 使用jar打war包或解压war包 进入Dos命令行,并...

    今天别的部门的同事传来一个包,说叫解压替换一个Java项目下的目录即可
    我拿到了手,一看NM这怎么解压,不是通常的那种压缩格式,遂立马百度,来弥补一个C++程序员受伤的心灵

    使用jar打war包或解压war包
    进入Dos命令行,并到目标文件夹,将相应文件打成war报

    // 1、打包
    jar -cvf target.war ./*
    
    //2、解压 
    jar -xvf target.war
    

    我使用了解压命令,将解压出来的东西替换掉原来项目中的旧文件就可以了

    展开全文
  • 多个war包打成ear部署was

    千次阅读 2015-06-02 15:39:27
    1.创建打包目录,本人在桌面...2.将各war包放入package文件夹下 3.编写application.xml文件代表一web应用,表示部署到was后,仅表示应用名称。表示war包名称。 表示部署路径,各module子节点值不要同名。 4
  • war包内更新文件

    2018-09-02 09:22:00
    1.如果要替换文件直接在war包的根目录(一级目录)下,直接使用jar uvf命令替换即可 如:替换a.war中b.xml文件 jar uvf a.war b.xml 注:b.xml需要和a.war在同一目录下。 2.如果要替换文件在...
  • 修改war包文件 jar uvf

    2020-07-20 15:40:21
    最近在搞一个替换登录页面的任务 然后给的是一单点登录的war包 需要修改war包里的文件 我之前就暴力用360好压直接修改 修改html还是可以的 但是把其他静态资源替换的时候 报错:java.lang....
  • 文件包War包

    2013-05-25 15:14:00
    PS:今天上午,非常郁闷,有很简单...war是一JAR文件,其内容包含: JSP页面,JavaServlet,Java classes,XML文件,标签库,静态页面以及其它构成(constitute)Web应用程序的资源。 结构特征 一web....
  • 我现在做的一个系统包含多个工程,这些工程都引用了一个子工程,这个子工程中jar比较多,打war包时子工程中的jar没有被打入到war中,求解决!
  • WAR包与配置文件分离(二)

    千次阅读 2019-01-24 16:13:17
    Java开发中经常打WAR的人会遇到一问题,每次都得根据部署电脑的IP、路径等信息修改工程中的配置文件。但是每次都这样还是非常烦人的。 下面介绍一下如何将配置文件分离出来,这样每次打WAR包的时候就可以直接将...
  • 注意红框内重点 1.maven-war-plugin这jar是针对pom文件内的properties内定义的变量进行替换 2.一定要在delimiter内指定静态资源内使用的需要替换的标识符! 3.include内是指需要替换的静态资源类型和目录 **/*....
  • 问题背景:在Linux环境上的weblogic发布war包,有时候只是修改了几个文件,也要上传整个war包,这样很费时间,因此整理了一下Linux环境,更新单个文件的方法。 1.如果要替换的文件直接在war包的根目录(一级目录)...
  • 服务器部署War包

    千次阅读 2019-06-09 22:37:25
    服务器部署War包项目 可使用VNC远程连接服务器,Server服务器地址,点击Connet,输入用户名及密码; 连接上服务器后,通过回收站找到我的电脑D:盘,找到D盘code目录下的apache-tomcat-8.5(我的Tomcat是在D:/code...
  • 打包生成war文件

    万次阅读 2013-06-26 15:54:29
    借用一个老兄的话,“当你一个web应用程序很的时候,如果你想把它部署到别的机器上,来回拷这些文件是件挺郁闷的事情,如果要是一个文件就好了。。。那么war文件就可以满足你这个小小的要求”。   那有人会说,...
  • 针对环节,从源头打包入手,当然这些都可以在运维阶段用脚本进行替换来代替 resources/environment/下有四环境,local本地、dev开发、test测试、pre预上线、prod生产,打包命令如下: # 本地 mvn clean ...
  • 但一定会有那么些时候,你需要修改或是替换jarwar包,ear包中的某个文件而不是整个重新生成。比如说,你有一ear已经部署到客户的服务器上,运行了有那么久了,版本也很老,但一让你头痛的bug需要立即在...
  • tomcat部署war包,jar

    万次阅读 2017-12-15 17:08:17
    在tomcat根目录下部署war包,通过http://ip:port的方式访问 网上说的方法很,这里记录一下自己的经过实践检验的一种...例如下面写的是webapps,那就在webapps/ROOT/路径下解压你的war包。如果appBase=XXX,那么就...
  • jarwar包

    2017-03-12 21:06:00
    Jar (Javaarchive), 是将实现了某功能的所有类及辅助资源用ZIP压缩形式打包而成的一个文件, 便于代码的管理和重复使用。当使用别人提供的jar时,只需要在classpath环境变量中添加这个jar文件,java虚拟机会自动在...
  • 当将项目打包成war包时 会将项目的所有资源放入web-INF下 lib里放的是jar classes中放的是资源文件和编译好的Java代码     String path = this.getClass().getResource("/").getPath(); ...
  • WAR包补丁工具

    2019-06-21 14:32:46
    因目前处于运维历史悠久的WEB项目中,每次需求开发完成需要更打补丁文件,因此编写打补丁工具,以解决手动查找补丁文件的繁琐且重复操作。纯Java代码编写,使用Swing作为界面UI,原有代码只针对特殊使用场景,可以...
  • 准备一 war 项目1.新建 SpringBoot war 项目三.配置docker插件1.新建docker配置2.配置docker远程地址四.编写DockerFile1.新建 Dockerfile 文件2.完善配置五.一键部署1.构建镜像2.测试3.查看镜像及容器 Idea之...
  • 可以在resources中放置例如:名字为“111”的文件夹,下面放置好需要替换的配置文件,然后执行build.gradle就能够就行war 的打印,如果需要一次打多个包,可以将如下代码,进行多次配置,就能够一次打多个war包,在...
  • 使用weblogic发布war包遇到的坑

    千次阅读 2018-05-17 16:16:36
    1.jar冲突首先由于tomcat和weblogic环境不一样,很时候本地用tomcat开发运行都OK,然后打成war包之后放到weblogic下启动会报错,jar冲突的错。原因是你的项目中一些常见的在weblogic中是自带的,所以只要将...
  • 但一定会有那么些时候,你需要修改或是替换jarwar包,ear包中的某个文件而不是整个重新生成。比如说,你有一ear已经部署到客户的服务器上,运行了有那么久了,版本也很老,但一让你头痛的bug需要立即在...
  • 这两天公司有一需求就是有一来自于别人的项目,只有tomcat下部署的war包和一配合程序使用的jar,额。。。。于是狼来了(问题来了。。呵呵),我需要将class文件反编译成java文件,这样一看,很简单啊,找...
  • Mac如何替换jar指定的文件

    千次阅读 2019-10-23 11:13:27
    今天做项目需要把dubbo服务接口更新到公司内中央仓库 但是这对外提供dubbo服务的的jar跟项目的jar不一样 所以需要把class文件替换之前的jar,上网找了很方法 ,感觉先解压了再打包jar比较麻烦 而且mac中又不可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,912
精华内容 7,164
关键字:

war包替换多个文件