部署一个件简简单单的项目竟然会遇到这么多事?
需求:
服务器已经存在了很多PHP项目,现在我新写的javaWeb项目要部署到同一服务器中新安装的Tomcat里面去,并且可以用域名进行访问。
准备:
1.先安装jdk,tomcat,mysql(不管windows系统,还是linux系统,推荐使用宝塔控制面板,可视化,优秀,很nice!!!)
2.Springboot项目打war包,放入Tomcat中
问题1:
Springboot项目到底用内嵌的tomcat启动,还是用外部的?
解决1:
我先去看了Spring Boot:内置tomcat启动和外部tomcat部署总结文章,先用内嵌的打了jar包,放进linux系统里,反正我是死活启动不了,报一堆错哟,我也不清楚我的jar包是不是有问题
果断决定使用外部tomcat打war包方式,这种方法好赖我使用过-->那就开搞。
问题2:
Springboot需不需要把内嵌的tomcat注释掉?
解决2:
我一开始照着SpringBoot使用IDEA设置的外部Tomcat启动,
springboot如何使用外部tomcat容器,这类文章进行修改:
1.先修改pom文件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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-web</artifactId> <!-- 移除嵌入式tomcat插件 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
javax.servlet-api 也需要加,不然session会报错
2.修改Springboot启动类
-
外部容器部署的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法:
@SpringBootApplication @ServletComponentScan @ComponentScan(basePackages = {"com.example.controller", "com.example.service"}) @MapperScan(basePackages = {"com.example.dao"}) public class SpringbootdemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringbootdemoApplication.class); } public static void main(String[] args) { SpringApplication.run(SpringbootdemoApplication.class, args); } }
后来我发现,不注释内嵌tomcat也没啥关系,之后就不再管了,直接把打war包,往tomcat里面扔,哈哈哈哈!
但是,要知道有这么个事!
问题3:
因为我是使用Springboot写的项目,Springboot内嵌了Tomcat,所以本地启动进行访问,不需要加项目名就可以
但是放进外部的Tomcat进行启动,必须要加项目名,Tomcat才能知道你要访问哪一个项目,解决方案如下:
解决3:
Tomcat里面的server.xml文件需要在<Host>标签里加上一个<Context>标签,里面写好项目名
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Context path="" docBase="项目名" debug="0" reloadable="true" caseSensitive="true" /> </Host>
docBase里添写项目名
问题4:
因为服务器里面已经有别的PHP项目了,用Apache环境的80端口启动的,但是我新加的tomcat是8080端口,启动项目要是用域名+端口号就显得很low,但是80端口已经被占用了,却不能关闭它,这个怎么办呢?
解决4:
1.nginx可以实现,缺点:如果安装nginx之前,服务器就有了其他项目,那么需要删除掉站点,安装好了再重新建立站点,怕不是在逗我玩?
2.IIS下建立站点?这种方法只是写一个html,我试了许久,不知道这个htm该放在哪里,所以没成功。
3.最后还是用了这个方法:Apache和Tomcat公用80端口
其实这面方法是一个意思,都是反向代理的意思。