海码充电站的技术专栏 java Coder

maven- - 可执行jar包

2018-12-25
watermelon


maven

前言

使用maven打可执行jar包,spring和springboot中有点区别(感觉用处不大,因为可执行jar包几乎需要容器IOC支持,甚至要Aop事务,而默认jar都是Appclication.java入口的)

1:spring中的打包

<project>  
  [...]  
  <build>  
    <plugins>  
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>cn.faceland.springboot.task.PrintTask</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin> 
    </plugins>  
  </build>  
  [...]  
</project>

2:springboot的打包

springboot用上面的方式打包会报错:“ Cannot find ‘resource’ in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer -> [Help 1]”

处理:springboot本身就带有自己的打包插件,spring-boot-maven-plugin 这个插件就可以完成打包的工作。如果画蛇添足引用了Shade反而会导致一些冲突。

<project>  
  [...]  
  <build>  
    <plugins>  
      <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.4.RELEASE</version>
            <configuration>
                <mainClass>${start-class}</mainClass>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>  
  </build>  
  [...]  
</project>

git操作

  • 1:将生成的jar拖到桌面上,
  • 2:然后WIN + R键打开命令窗口,
  • 3:输入 java -jar 并把jar拖到命令窗口中,
  • 4:然后回车键运行即可

命令窗口操作jar

### 3:可执行jar有没有集成tomcat的区别

  • 1:集成了tomcat
    java -jar xxxx.jar
    

    经实验,无论是windows,还是linux,命令窗口保持打开,则项目一直正常运行,且端口保持占用。如果在linux使用crontab定时触发,一样,项目依然正常运行,后面每次触发都会端口占用错误。 (虽然这个定时任务触发的思想很奇怪,类似于定时重复启动tomcat一样,但为了好奇,还是测试了番,果真如此)

  • 2:不集成tomcat 做法:注释掉spring-boot-start-web
         <!--<dependency>-->
             <!--<groupId>org.springframework.boot</groupId>-->
             <!--<artifactId>spring-boot-starter-web</artifactId>-->
         <!--</dependency>-->
    

    idea上run项目的Application.java是就会发现没有端口号打印。 打包成jar在上述方式中运行测试,发现启动只有一次性。可重复运行。
    如果再配合启动回调。就能够实现一次性的任务,且支持动态传参(参考本站帖子:springboot启动回调)。

4:如何把可运行jar改造成监听器(不集成tomcat)

可以考虑在jar的main方法,或者runner方法中设计:

while(true){
    //do something
    //例如查库表,查缓存,等等,查到了再做一些处理
    //为了节省资源,可以Thread.sleep(0.5秒、若干秒);等
}

引用:


Comments

Content