maven————打包遇到的“坎”

自从用maven接管项目以后,打包就不用 人工的打了。

1:打成jar包

用maven打成jar包一起有很多方法,这里我就写一下我用过的两种方法:

  1. 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以后,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值