0.前提
springboot在本地能够服务正常启动,接口调用都能实现。
1.idea操作
首先在pom.xml中增加配置信息
<groupId>com.bonc</groupId>
<artifactId>energy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<!--finalName指定最终生成Jar包的名称,如果不指定,则为前面配置
artifactId+version(energy.0.0.1-SNAPSHOT.jar)作为jar包的名称-->
<finalName>energymanagement</finalName>
<!--配置资源-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>application*.properties</exclude>
<exclude>conf/dev/*</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources/conf/${profileActive}</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<!--在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运
行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用
的部署,只需要安装了 JRE 就可以运行。-->
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!--热部署-->
</configuration>
</plugin>
</plugins>
</build>
上述的热部署true也可没有
接着在idea右侧,点击maven出现包,选择要打包成jar的包名,选择lifecycle,点击package.
终端会出现build success的字样说明成功。
我在生成jar包时报错,有几个本地的依赖missing,看到missing依赖的路径在lifecycle下面先点击clean,然后install。解决。
2.上传到服务器
此处有两种方法,一种是写sh脚本,另一种是用idea自带的自动部署。
upload.sh文件把当前目录下的jar包复制到服务器上去。
scp target/front-0.0.1-SNAPSHOT.jar root@www.sunagy.cn:/root/sunagyT/maz_demand/maz_demand_front.jar
此文件和pom.xml和target文件夹放在同一目录,修改名字和路径,可能需要端口号,scp -P 222 targetXXXXXX
windows在idea终端直接运行upload.sh
mac在idea终端运行sh upload.sh
第二种自动部署
进入idea,点击Tools/Deployment/Configuration
(connection)添加SFTP的远程服务器信息
mapping下填写本地和远程服务器项目路径
最后用IntelliJ IDEA打开项目,右键点击Deployment,Unpload to 配置名(或者Tools,Deployment,Unpload to), 上传。
此处是项目源码和jar包一起传到服务器
Tools/Deployment/option中可能能设置只传jar包,未测试和研究
3.进入服务器
mac,终端输入ssh -p 端口号 服务器用户名@ip (例如ssh -p 22 userkunyu@119.29.37.63
)回车,此处也可以直接是网址,不一定是ip,接下来是输入密码
windows,借助secure crt工具来连接服务器。
start.sh文件启动程序。
java -jar maz-dict.jar 5 > maz-dict.log &
echo $! > /home/john/iot-center/maz-modules/maz-dict/target/maz-dict.pid
stop.sh文件停止程序。
#!/bin/sh
PID=$(cat /home/john/iot-center/maz-modules/maz-dict/target/maz-dict.pid)
kill -9 $PID
上述两个文件是我手动添加到服务器上的,
在程序jar包的同一个目录下面,运行start.sh正常运行之后不会出现任何提示词,他会自动生成log文件和pid文件,用tail命令查看日志,
结束是用stop.sh。
在服务器上常用指令
chmod u+x *.sh 授权
rm -rf test 删除
touch *.sh 创建文件
tail -f xxxx.log查看日志文件
在启动过程中,发现auth的server端口被占用,修改。
又发现admin报这个错
org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name ‘eurekaAutoServiceRegistration’: Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
最后在admin下面添加类,解决
package com.sunagy.maz.security.admin.constant;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class FeignBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
private static final String FEIGN_CONTEXT_BEAN_NAME="feignContext";
private static final String EUREKA_AUTO_SERVICE_REGISTRATION_BEAN_NAME="eurekaAutoServiceRegistration";
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (containsBeanDefinition(beanFactory, FEIGN_CONTEXT_BEAN_NAME, EUREKA_AUTO_SERVICE_REGISTRATION_BEAN_NAME)) {
BeanDefinition bd = beanFactory.getBeanDefinition(FEIGN_CONTEXT_BEAN_NAME);
bd.setDependsOn(EUREKA_AUTO_SERVICE_REGISTRATION_BEAN_NAME);
}
}
private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans) {
return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b));
}
}
接下来,申请重新映射端口号,配置文件里的server的port号变成另外一个。
最后一步,postman测试。网址加上新映射的端口号加上测试路径。
τελικά,感谢网上技术大神分享!!!