SpringBoot工程将lib打包到外部的maven配置

一、配置layout为zip

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<!-- 排除所有Jar -->
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<excludes>
</excludes>
</configuration>
</plugin>

不配置这一项,maven将把整个应用打包成spring boot的可执行包带所有的library,用自己的ClassLaoder,体积巨大无比,唯一的优势是无需关注依赖。

对于开发阶段需要频繁更新的应用来说,每次部署需要上传的文件太大了。

二、配置将所需的lib输出到指定目录

只配置上面的插件,将只输出一个不包含Lib的jar包,而没有依赖文件,因此还应当添加如下插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>

这一插件将所有的依赖打包到输出目录下的lib子目录当中,发布时只需要发布一次这个目录,后面就可以只更新主jar包了(依赖有变化时当然也需要同步的更新此目录)。

三、配置spring-boot的启动类

配置完上面的之后打包出来的虽然也是spring-boot的包,但不是可执行包,它的ClassLoader不对,不可直接通过java -jar执行,此时再添加一个插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>xxxx.yyyy.zzzz.SpringBootApplicationClass</mainClass>
<!--取消jar包版本号-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>

注意其中的mainClass应当指向SpringBootApplication类完整路径,通过这个插件编译后的最大(本质上的唯一)区别是META-INF/MENIFEST.MF文件中的内容区别,具体内容就不说了。

 

 

 

 

 

Continue Reading

OSX系统启动与后台服务

  1. OSX启动过程
    1. mac固件激活,初始化硬件,加载BootX引导器。
    2. BootX加载内核与内核扩展(kext)。
    3. 内核启动launchd(init)进程。
  2. launchd进程
    1. 开机后先加载system wide daemon;加载完成后显示登录窗口;
    2. 登录后加载per user agents;
    3. 用户启动的所有的进程实际也是有launchd加载的!!!
  3. Launch Daemon与Launch Agent
    1. 两者都是后台服务,前者是系统级的;后者是用户级的;
    2. 前者在开机时会启动,类似windows的service;而后者必须要用户登录后才会启动;
    3. Launch Daemon/Agent都是有plist文件定义的,文件是xml格式;
    4. Daemon目录:
      1. /System/Library/LaunchDaemons
      2. /Library/LaunchDaemons
    5. OSX在开机时的操作:
      1. 注册在上述目录中的plist内的port和file descriptor
      2. 执行keepAlive=true以及RunAtLoad=true的Deamon
    6. 执行完deeon之后才会显示登录对话框
    7. 登录之后执行Launch Agents
    8. Agents目录:
      1. /System/Library/LaunchAgents
      2. /Library/LaunchAgents
      3. ~/Library/LaunchAgents
    9. 其它同Deamon
    10. 附图一张,测试一下修复之后的上传功能是否正常。 
    11. 2015122210312780909335
  4. Daemon的其它知识
    1. on-daemon:
      1. 相对于keepAlive而言,它允许被杀掉;而keepalive的daemon一旦被杀,launchd又会启动;
      2. on-daemon可以绑定端口,一旦收到发送到某个端口的包,自动启动某个进程;或其它依赖的情形也有可能导致daemon被启动;
    2. 允许定时daemon
    3. 允许监视某个文件或目录
  5. LoginItem
    1. 这个相当于Windows的“启动”开始菜单;
    2. 对于使用沙盒方式运行的程序,应当使用Service Management Framework方式加载。
      1. 要求必须有两个应用,一个是主应用一个是Helper;其中Helper不是沙盒应用;
      2. helper程序存放在主程序的Contents/Library/LoginItems目录下
      3. 主程序在运行时调用SMLoginItemSetEnabled()函数来设置helper程序为自启动程序。
    3. 主程序必须在Application的目录下,开机启动的设置才会生效,否则会失败
  6. StartupItem
    1. 此方法已不推荐
    2. 它从性质上像LoginItem,但不要求必须登录,又类似于Deamon。
  7. 优秀文章:
    1. MAC服务管理(launchd)
    2. OS X那些事—恶意软件是如何启动的
Continue Reading