war包运行偶尔漏掉部分程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了war包运行偶尔漏掉部分程序相关的知识,希望对你有一定的参考价值。

War包运行时可能会漏掉部分程序,这是一个常见的问题,可能是因为程序构建出错导致的,或者当项目构建时,由于某些原因某些文件或类没有添加到war包中而导致的。因此,在解决war包运行漏掉部分程序的问题时,应该首先检查程序构建是否存在问题,以及war包中的文件和类是否完整,是否遗漏了一些文件和类,如果发现有问题,应立即解决,以确保war包中的文件和类都完整无缺。在此基础上,可以进一步检查war包中的类依赖关系是否存在问题,以及war包中的类和文件是否有兼容性问题,以便最终解决war包运行漏掉部分程序的问题。 参考技术A war包运行漏掉程序的原因可能有很多,例如编译出现错误、程序内部存在 bug、程序的网络请求超时等等。具体原因可能需要通过日志分析才能确定。首先,可以对日志进行分析,以确定是什么原因导致程序漏掉。其次,可以检查程序的构建是否正确,以确保没有遗漏重要的文件。此外,可以检查程序是否正确处理了网络请求,以确保请求不会超时。最后,可以使用调试工具对程序进行调试,以确保程序代码中没有 bug。通过以上措施可以有效地排查出 war包运行漏掉程序的原因,从而解决问题。 参考技术B War包运行漏掉程序的原因可能比较复杂,一般可能有以下几个原因:

1. 配置问题:war包的运行会受到配置文件的影响,如果部署时配置文件没有正确配置,可能会导致程序漏掉。

2. 依赖问题:war包运行时有可能会依赖外部jar包,如果war包中缺少依赖的jar包,也可能导致程序漏掉。

3. 代码问题:war包运行时可能出现因为程序代码原因导致的问题,如果代码有语法错误或者程序逻辑错误,程序可能会漏掉某些部分。

4. 系统问题:war包可能会受到系统环境的影响,如果运行war包的服务器出现了一些环境问题,也可能导致war包漏掉程序。

对于war包漏掉部分程序的问题,最好的解决方案是仔细检查war包中的配置文件、依赖jar包、程序代码、系统环境,并且确保上述这些因素都是正确的,这样才能确保war包正确的运行,避免漏掉部分程序的情况发生。
参考技术C War包在运行时可能漏掉部分程序,这是由于war包的结构特点导致的。WAR(Web Archive)包是一种将Web应用程序打包的文件格式,其中包含了Web应用程序所需的所有文件,如Java类,JSP,html等,以及用于部署应用程序的元数据,如web.xml文件。由于war包的结构特点,它可以被称为“自包含的”,因为它可以被部署到任何Web服务器上,而不需要任何额外的依赖性。

但是由于WAR包结构的特点,它可能会在部署时漏掉部分程序。例如,如果某个程序在WAR包中未正确添加,或者如果某些程序在WAR包中缺少,那么这些程序将不会部署到Web服务器上,从而导致运行时漏掉部分程序。

因此,为了避免WAR包运行时漏掉部分程序,建议在打包WAR包时务必检查,确保所有需要的程序都添加到WAR包中,并且确保所有相关的依赖文件都是最新的,以保证WAR包中的程序都能够正常运行。
参考技术D 这可能是以下原因之一:

1. 您的war包中的程序在某些情况下没有正常部署或启动。

2. 您的服务器配置不正确,导致某些程序无法正确运行。

3. 您的代码中存在一些错误,可能会导致一些程序在某些情况下无法正常工作。

解决此问题的方法可能包括:

1. 检查您的war包中的所有程序是否正确部署到服务器上,并尝试重新部署。

2. 检查服务器配置是否正确,并尝试重新配置。

3. 检查代码中是否存在错误,并尝试修复它们。

如果问题仍然存在,请尝试与您的服务器管理员或开发人员联系,以进行更详细的排查和解决。

SpringBoot 项目运行在 tomcat7 上

SpringBoot 项目如何打成 war 包

SpringBoot项目的默认打包方式是将工程打包成为一个 jar 包。部分情况下,我们需要将项目打包成一个 war 包,以方便我们将工程部署在 tomcat 上运行。

那如何将 SpringBoot 项目打包成一个 war 包呢?

pom 文件修改

修改打包方式。由于 SpringBoot 的默认打包方式将其打包成 jar 包,所以创建出来的项目的 pom是没有特殊声明 packaging 的元素。所以首先要在 pom 坐标处增加<packaging>war</packaging>的设置。

因为使用的 SpringBoot,而且选中了 web的 start,其内置 tomcat服务,但是我们这里又需要手动将其部署到 tomcat 上,所以要将 spring-boot-start-web 中移除对spring-boot-start-tomcat 的依赖传递,所以pom 文件中需要这样修改。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 移除嵌入式tomcat插件 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后 pom 中添加 servlet-api 的依赖。下面有两种方法,可以任选其中一个

方法一:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

方法二:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>8.0.36</version>
    <scope>provided</scope>
</dependency>

最后将 pom 文件中元素中添加元素并赋值为你需要的打包的名字,比如我这边的手头的这个例子,我希望打出来的 war 包名字为 dataServer.war。所以我的设置是这样的。

<finalName>dataServer</finalName>

到目前为止所有的pom 修改就已经完成了,现在需要修改启动类,并重写初始化方法

重写初始化方法

我们平常用main方法启动的方式,都有一个App的启动类,代码如下:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我们需要类似于web.xml的配置方式来启动spring上下文了,在Application类的同级添加一个SpringBootStartApplication类,其代码如下:

/**
 * 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
 */
public class SpringBootStartApplication extends SpringBootServletInitializer {
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(Application.class);
    }
}

打包

在项目根目录下(即包含pom.xml的目录),在命令行里输入:
mvn clean package即可, 等待打包完成,出现[INFO] BUILD SUCCESS即为打包成功。

如何在 tomcat8 上运行

把target目录下的war包放到tomcat的webapps目录下,启动tomcat,即可自动解压部署。
最后在浏览器中输入http://localhost:[端口号]/[打包项目名]/即可浏览。

我再 tomcat8 上运行没有发现什么问题,然后我将程序部署到了服务器上却出现了问题。服务器上 的 tomcat 版本是 7.所以我在本地重新部署了一套 tomcat7 的运行环境用来测试,结果却意外发现了大问题。

如何在 tomcat7 上运行

在 tomcat7 上运行打好的包的时候出现了这样的一个错误。我曾在Stack Overflow 上进行查找,找到一个比较靠谱的解释。大致是说,之所以在 tomcat8 上可以运行,而 tomcat7 上不能运行,是因为 tomcat8中已经包含 el-api 3.0而 tomcat7 上只有el-api 2.2。

解决方法也说的是五花八门,我尝试过很多种方法,最后是一个意想不到的方法帮助我解决了这个问题。

看了网上所说,把tomcat/lib下的el-api.jar拷贝到D:\\xxx\\jdk1.8.0_121\\jre\\lib\\ext发现还是一样的异常;反编译el-api的确没有ElManager,在el-api3.0才引入.so ,下载el-api3.0.jar,放到jdk或者只放tomcat/lib都可;(直接使用tomcat8也可解决)

然后我将本地 maven 仓库中的el-api3.0 copy 到了 tomcat7 的 lib 路径下,然后将文件放进去,再次使用 catalina 执行 tomcat 没有报错了。真的是坑。。。

以上是关于war包运行偶尔漏掉部分程序的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat war包部署

前端如何打war包

关于tomcat部署WAR包的问题

部署为 war 文件时如何运行 Play Framework 演变

关于Java打war包

IDEA如何打出war包