war包部署到tomcat
1、上传新war包到webapps
/apache-tomcat-8.5.37/webapps/
2、终止tomcat
/apache-tomcat-8.5.37/bin/shutdown.sh
查看对应端口是否关闭
netstat -tlinp
3、启动tomcat
/apache-tomcat-8.5.37/bin/startup.sh
查看启动日志
less /apache-tomcat-8.5.37/logs/catalina.out
maven插件打包
通过 maven-shade-plugin 生成一个 uber-jar,它包含所有的依赖 jar 包。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- 设置 MainClass -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxx.examples.Main</mainClass>
</transformer>
<!-- 如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。
原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,
如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并-->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
* compile,缺省值,适用于所有阶段,会随着项目一起发布。
* provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
* system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
1compile 的范围
当依赖的scope为compile的时候,那么当前这个依赖的包,会在编译的时候将这个依赖加入进来,并且在打包(mvn package)的时候也会将这个依赖加入进去
意思就是:编译范围有效,在编译与打包时都会存储进去
2provided的范围
当依赖的scope为provided的时候,在编译和测试的时候有效,在执行(mvn package)进行打包成war包的时候不会加入,比如:servlet-api,因为servlet-api,tomcat等web服务器中已经存在,如果在打包进去,那么包之间就会冲突
3test的范围
当依赖的scope为test的时候,指的的是在测试范围有效,在编译与打包的时候都不会使用这个依赖
4runtime的范围
当依赖的scope为runtime的时候,在运行的时候才会依赖,在编译的时候不会依赖
注:在默认的情况下scope的范围是compile
参考:maven dependency中scope=compile 和 provided区别_路越的博客-优快云博客
maven项目 porm.xml中Dependency Scope属性_清风狂暴的博客-优快云博客
IDEA打包
打开IDEA的file -> Project Structure,进入项目配置页面。如下图:
点击Artifacts,进入Artifacts配置页面,点击 + ,选择如下图的选项。
进入Create JAR from Modules页面,按照如下图配置。
- 第一步选择Main函数执行的类。
- 第二步选择如图的选项,目的是对第三方Jar包打包时做额外的配置,如果不做额外的配置可不选这个选项(但不保证打包成功)
- 第三步需要在src/main目录下,新建一个resources目录,将MANIFEST.MF文件保存在这里面,因为如果用默认缺省值的话,在IDEA12版本下会有bug。
点击OK之后,出现如下图界面,右键点击<output root>,点击Create Directory,创建一个libs,将所有的第三方JAR放进libs目录下。
成功之后,如下图所示:
放入之后,点击我们要打成的jar的名字,这里面是kafka-cps.jar,选择classpath进行配置。
编辑的结果如下:
这里将所有的jar都写在libs/里面。点击OK,回到配置页面。
同时还注意在配置页面,勾选build on make
最后点击配置页面的OK,完成配置。回到IDEA,点击Build->Build Artifacts,选择build
就会生成我们需要的jar包。其位置在项目目录的out目录下/out/artifacts/kafka_cps_jar。
下面放一个正确配置的清单文件内容
springBoot项目打包
1、pom.xml
<build>
<!-- 指定名字 -->
<finalName>CommApp</finalName>
<!-- 打包插件 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!--编译的时候通过反射获得具体的参数名-->
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<!--生成源码jar包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1、xxxx.jar:编译后的xxx.class文件组成的jar包(我们一般引的是这种包),可以运行。Java的jar包里面放的其实是编译后的.class文件,经过IDE自身的反编译工具反编译出源代码,所以他的没有注释的。
2、xxxx-sources.jar:没有编译过的源代码包,存放的是xxx.java文件,这种包查看的时候带有注释(查看源码想要有注释要引这种包到Libraries),不能运行,如果要有注释的话,需要把他的源代码包导进来(xxx-source.jar)
3、xxxxx-javadoc.jar:存放API说明文档的jar包,想查看类的详细用法说法可以看这个包, 不能运行
xxxxx-javadoc.jar配置方式如下
<profiles>
<profile>
<id>disable-javadoc-doclint</id>
<activation>
<jdk>[1.8,)</jdk>
</activation>
<properties>
<additionalparam>-Xdoclint:none</additionalparam>
</properties>
</profile>
</profiles>
<!--生成doc jar包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<!-- 解决控制台乱码 -->
<charset>UTF-8</charset>
<encoding>UTF-8</encoding>
<docencoding>UTF-8</docencoding>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalOptions>
<additionalOption>${javadoc.opts}</additionalOption>
</additionalOptions>
</configuration>
</execution>
</executions>
</plugin>
参考:JDK8下maven使用maven-javadoc-plugin问题_maikelsong的博客-优快云博客
Maven导入本地jar包
引入本地 JAR 文件
<dependencies>
<dependency>
<groupId>local</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/名称.jar</systemPath>
</dependency>
</dependencies>
本地可以运行,打包后运行报错java.lang.NoClassDefFoundError。
问题的原因是在项目中,jar 被定义为一个系统范围的依赖项,因此在默认情况下,它不会被包含在生成的 JAR 文件中。打包用的是spring-boot-maven-plugin 那么针对 Maven 插件需要添加<includeSystemScope>true</includeSystemScope> 的配置,需要注意的是,这种做法仅适用于将jar包作为系统范围依赖项引入的情况。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>