自从用maven接管项目以后,打包就不用 人工的打了。
1:打成jar包
用maven打成jar包一起有很多方法,这里我就写一下我用过的两种方法:
- assembly,在pom.xml中添加如下代码:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifest>
<!--表示你的系统的系统类,也就是main方法的类-->
<mainClass>com.byd.Start</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
打包 以后会包含所有的jar包,但是这里碰到了
第一个问题:我的项目是用Springmvc来做的,所以里面用到了javaee-api-7.0.jar,但是在项目中又没有完全的引用到具体类,可能是某个类中的关联用到了这个jar中的类,所以一直报错,找不到javaee-api-7.0.jar中的某人个类。后来原因发现 maven引入的javaee-api-7.0.jar的scope是procided:这个表示意味着打包的时候可以不用包进去,别的设施(web container)会提供。事实上该依赖理论上可以参与编译、测试、运行等周期。相当于compile,但是打包阶段做了exclude的动作。所以将scope修改成compile,这个问题解决。
接下来继续运行jar,发现还是报错,报错内容为:
1.读取不到xml配置文件;
2.貌似读取到了xml文件,异常org.springframework.beans.factory.NoSuchBeanDefinitionException,实际还是xml文件并没有被正确读取解析;
3.包冲突;
解决方法:使用其他插件打包 shade这个插件,pom.xml引用代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--你的main的类-->
<mainClass>com.byd.Start</mainClass>
</transformer>
<!--为了防止spring的xml的配置读取错误,这两行必须加-->
<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>
OK,这个问题解决。
综上为止,我们基本解决了 将springmvc的项目打包成jar包运行的问题,接下来我们需要将一个真正的web项目打包成war包,记录一下几点,我的项目是spring boot项目:
1、<packaging>war</packaging>。
2、几个主要插件如下:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
<!-- 支持maven打包自定义名字 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warName>BYD_PAS</warName>
</configuration>
</plugin>
打包完成以后将war包放入 到tomcat下面之后发现报错,报错代码如下
严重: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Product]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1229)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1875)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
四月 17, 2018 7:55:43 上午 org.apache.catalina.startup.HostConfig deployDirectory
严重: Error deploying web application directory H:\apache-tomcat-7.0.52-windows-x64\apache-tomcat-7.0.52\webapps\Product
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Product]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1229)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1875)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
查阅资料发现可能是 tomcat包与springboot的中相关包版本不匹配导致,将tomcat从7.0.85升级到9.0.65以后,问题解决。