化石原创文章,转载请注明来源并保留原文链接


前面,我们在CentOS 7上架设了Tomcat 9,并且能够在logs目录下看到Catalina.out这个log文件(非常详细的本来控制台输出对应的log)。大多时候,我们可能都通过看log,回溯并解决相应的问题。

但是很多时候,比如刚开始部署就发生些原来不曾遇到的问题,能通过控制台看到事实的输出就成为一个必要的手段。在CentOS上,这个只需要一个命令:

tail -f catalina.out

tail命令负责的事情是,让指定文件(上面的命令指定catalina.out)最后的N行(默认为10)内容输出到标准设备上(默认是终端,也就是console)。参数-f,让tail负责持续监控文件的改变,有改动一并把改动输出。

因此,通过该命令,我们就能在控制台看到服务器的相应输出。调试自己的Java Web Application,只要通过System.out.println()输出信息,就能在Console上看到。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


1、下载最新版的tomcat 9

通过浏览器得到最新版本的详细地址(因apache会删除一些版本,所以如果按照网上的一些文章的地址,可能会访问错误)

a、浏览器地址栏输入http://www-us.apache.org/dist/tomcat/tomcat-9

b、在该网页上看到列出的最新版本,一般是一个以版本号为名字的文件夹

c、进入该文件夹,再进入列出的bin文件夹

d、找到tar.gz结尾的那个文件,然后根据上面的信息,组织出要下载的文件的路径,比如http://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.30/bin/apache-tomcat-9.0.30.tar.gz

e、下载,命令

wget http://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.30/bin/apache-tomcat-9.0.30.tar.gz

2、把下载的压缩文件移到/usr/local/ (我的习惯,这里是手动绿色软件的存放处)

mv apache-tomcat-9.0.30.tar.gz /usr/local

3、解压缩,得到绿色版tomcat 9

tar -xvf apache-tomcat-9.0.20.tar.gz

到这里,tomcat 9算是安装好了。下面是配置

4、配置CATALINA_HOME

echo "export CATALINA_HOME="/usr/local/apache-tomcat-9.0.30"" >> ~/.bashrc
source ~/.bashrc

这样我们就配置好了,注意上面的apache-tomcat-9.0.30是自己的解压缩后的绿色软件的根目录(文件夹)名字,需要根据实际改变。而CATALINA_HOME是后面我们启动tomcat 9,tomcat 9会寻找的一个环境变量。

5、启动

进入绿色安装包的bin,按我们前面的路径,应该是

/usr/local/apache-tomcat-9.0.30/bin

使用命令:

sudo ./startup.sh

6、测试

通过远程机器,访问CentOS所在服务器的8080端口,应该能看到tomcat 9的默认主页。

后续:

1、上面的启动对应的关闭,是同文件夹下的shutdown.sh脚本。

2、关于logs,在CentOS(Mac同)上,可以通过service方式启动tomcat,但是在安装目录下,logs文件夹中不会产生catalina.out文件。这个文件会存放详细的log信息,是最重要的一个log文件。

要产生这个文件,必须使用上面的startup.sh脚本。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


背景

一个Intellij,mavn工程。

1、使用了local的jar作为lib

2、使用main()方法作为入口方法

3、使用ftl文件作为模板(FreeMarker)

在使用Intellij开发的时候,没有任何问题。现在要发布到外部机器,希望用户能通过web默认端口80访问。

需要的步骤

1、通过Intellij的maven工具,package命令打包成war文件或者是war同等的文件夹

可能会遇到的问题:

因为使用local的jar,而不是maven reposity的,而local jar是通过File|Project Structure… |Library添加,所以package命令不能成功,遇上这个jar找不到问题。

解决方案:

在项目的pom.xml中,加入使用<systemPath>的<dependency>项,告知maven工具local的jar路径

注意:

如果项目非有springboot initializer生成,那么还需要在pom.xml中加入

<!--  手工设置:让打包成war的设置  -->
<packaging>war</packaging>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

一个完整的的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>wlxsphb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--  手工设置:让打包成war的设置  -->
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>it.sauronsoftware</groupId>
            <artifactId>base64</artifactId>
            <version>1.3.1</version>
            <scope>system</scope>
            <systemPath>C:/Users/HanIT/.m2/repository/it/sauronsoftware/base64/javabase64-1.3.1.jar</systemPath>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、在main()中,有初始化的代码,会在springboot模块前后初始化自己的类

可能会遇到的问题:

发布到外部tomcat,这个main就不会被主动运行。tomcat会由spring boot去寻找SpringBootServletInitializer继承类的configure()方法运行(代替这个main)。所以,所有的初始化没有机会,就导致后续的各种错误,而导致服务无法正常,最常见的就是各种NullException的发生。

解决方案:

1、在Override的configure()中,拷贝对应的初始化方法。视confiure()为入口方法。

有了上面两个大前提,把一个这样的web application放置到外部tomcat的步骤就是:

1、删空tomcat webapps下的ROOT文件夹下所有默认文件(这个方式让web application的根目录替代默认的网站根目录)

2、使用maven的package,打包出target下的war,同时会有同名目录放在war旁

3、拷贝这个同名目录到ROOT下,spring boot工程会出两个文件夹,一个为WEB-INF,另外一个为META-INF。WEB-INF中,含两个目录:classes和lib。classes包含的是Intellij项目中java(src目录)下的java代码产生的class(按原目录组织)文件和resources下所有文件(文件夹);lib下是项目中用到的maven引用的其他jar。META-INF文件夹可能是空的。

查错

发布到外部的tomcat,启动服务后,看不到自己的网站页面,或者看页面时见到错误。查错的方式是看tomcat的日志:在tomcat安装目录下,有logs文件夹,启动服务后会出现很多的log文件,主要是stderr字眼的文件和stdout字眼的文件。严重的错误,比如spring boot前就发生的错误,比如configure()方法就发生了导致springboot不能继续的错误,在stderr中能看到。而后续的各种mapping错误,信息等,都可以在stdout中看到。

常见的System.out.println()发出的信息,在这些文件里都会存在。

修改默认的8080端口

打开tomcat安装目录下的conf文件夹下的server.xml,查找8080字眼,应该能看到未注释的如下字眼:

<Connector port="8080" protocol="HTTP/1.1"            connectionTimeout="20000"            redirectPort="8443" />

改动其中的8080到80,保存。然后重启tomcat即可。


化石原创文章,转载请注明来源并保留原文链接