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

Git操作技巧

用了很长时间的ssh key,又用了很久的git/git bash(Windows),但总是遇到配置git+ssh key之后仍然提示密码的问题,今天测试梳理了一下:

  1. git bash是不能保存ssh的密码的,因此只能使用ssh key的方式;
  2. git bash需要复制证书文件到~/.ssh目录,注意!!!如果不做后面的操作,文件名密码是id_rsa,其它文件都无效!!!
  3. 如果需要使用自己的证书文件,有两种方案:
    1. 改名为id_rsa,这是最简单的;但如果id_rsa已经用于其它证书用途就不方便了;
    2. 配置~/.ssh/config文件,增加相应的GIT服务器的主机配置,指定相应主机(GIT服务器)所使用的证书;
  4. 配置证书拟合用的用户名
    1. 在config文件中指定User git;这是通常的做法,建议配置一下;
    2. 用户名就是仓库链接@前面那个,一般是git,如:git@192.168.1.2:xg/2021-32001-xg-ir/2021-32001-xg-ir-cv2.git
    3. 实测:不配置User或配置错误的用户名,貌似都能提交成功。
  5. 用户名与email配置不会影响提交,但必须配置(用于识别);即:
    1. 用户名与email与GIT系统配置(如gitlab)中实际指定的用户名与email无关;
    2. 与SSH KEY中指定的邮箱无关;
    3. 提交后显示的日志中将显示该用户名及邮箱。
  6. gitlab支持push rules限定提交的用户必须是有效的,但这是收费功能。
Continue Reading

测试marsedit使用语法高亮

测试在MarsEdit工具中使用Macro快速输入代码,根据网上的教程添加了一个Macro并绑定快捷方式,始终得不到想要的效果。
发现可能是一个BUG,表现为:

  1. 先复制文本;
  2. 直接执行Macro(菜单或快捷键效果一样)
    表现的效果就是Macro执行了,但好像剪贴板是空的一样。

换个执行方式:

  1. 复制文本
  2. 粘贴到内容区
  3. 选中
  4. 再执行Macro:)
package com.vc.xg.wmjl.opc.db.model.base;
 
public class DataSourceHolder {
 
    private static final ThreadLocal dataSources = new ThreadLocal&lt;&gt;();
 
    public static void setDataSource(String dataSource) {
        dataSources.set(dataSource);
    }
 
    public static String getDataSource() {
        return dataSources.get();
    }
 
    public static void clearDataSource() {
        dataSources.remove();
    }
}

 

缺点:

  1. 上面这个BUG增加了操作步骤;
  2. 不能将光标停在lang=””的位置,以便快速修改语言类型;
  3. 不能自动切换到Plain Text模式,如果在RichText模式看不到pre标签。

另外有一个注意事项:如果在保存时没有填写lang=””里的内容就发布了,再次打开时将没有lang这个属性。

Continue Reading

优化Olsen Light布局

Olsen Light默认的1040宽度,8:4的conent:sidebar现在看来太窄了,又不想升级PRO:)

1. 增加额外的css设置

此步骤中的1600px可根据需要调整:)

.container {
width: 1600px;
}

2. 修改Main Index Template (index.php)

在原第19行位置,找到如下代码:

&lt;div class="“col-lg-8”"&gt; &lt;/div&gt;
 
 <div class="col-lg-9"></div>
 

用<!— —>注释掉; 增加如下代码:

 

在原大概第68行位置,找到如下代码:

&lt;div class="“col-lg-4”"&gt; &lt;/div&gt;

同样用<!— —>注释掉; 增加如下代码:

&lt;div class="“col-lg-3”"&gt; &lt;/div&gt;

这样就将显示为9:3的大小,看起来舒服多了。

3. 修改layout.php (inc/layout.php)
这是后面研究的第二个方案,比第2种更简单。注意:第一步仍需保留!

注释掉原代码的第31-32行:

$content_col       = ‘col-lg-8’;
$sidebar_right_col = ‘col-lg-4’;

新增如下代码:

$content_col       = ‘col-lg-9’;
$sidebar_right_col = ‘col-lg-3’;

也可删除(修改)而不是注释,用注释是想保留原代码。

Continue Reading

VIM操作技巧

  1. 基础说明
    1. words 由空白字符分割,基本上可理解为字母数字下划线以外的都算分割符;
    2. WORDS 由非关键字分割的都算。注意,冒号(:)算;
  2. 定位
    1. hkjl 等于方向键
    2. 0行首
    3. ^本行第一个非空字符
    4. $行尾
    5. g0 单行显示换行时,移动到本屏幕显示行的行首!!
    6. g^ 单行显示换行时,移动到本屏幕显示行的第一个非空字符
    7. g$ 单行显示换行时,移动到本屏幕显示行的行尾
    8. #f% 向后查找#个字符(%)并停在该位置,f改成F为向前;
    9. ; 重复上一次的f/F操作
    10. , 重复上一次的t/F的反向操作
    11. #-|+   向上或向下移动#行,都移动到行首非空
    12. gg 文件头
    13. G 文件尾
    14. #G 跳到第#行
    15. w/W 按单个单词前进,每次移动到单词头部;
    16. e/E  与w/W相同每次移动到单词尾部。
    17. b/B 按单个单词后退,每次移动到单词头部;
    18. ge/gE 按单个单词后退,每次移动到单词尾部;
    19. () 按句子移动
    20. {} 按段落移动
    21. [],]],[[,][ 不太理解
    22. zt z. zb  移动屏幕,注意是移动屏幕的内容,而不是光标,之当前光标位置显示在屏幕的顶部,中间和尾部。
    23.  
  3. 删除操作
    1. dd 删除当前行
    2. #dd 删除从当前行起的#行
    3. :.,+2d 删除从当前行起行及后面的2行(共计3行),同样-2是往前删除;
    4. d$ d^ dE dW 等均可删除
  4. 标记指令
    1. 标记支持a-z和A-Z
    2. a-z是单文件内的;不同文件内容的a-z可以全不相同,每个文件有自己的设置;
    3. A-Z是全局的,即与文件关联的;整个主机只有一套;
    4. ma设置a标签在当前行,当前列;如果a已经存在则移除;
    5. marks 列出所有标记
    6. marks aB 列出标记a和B
    7. delmarks a-d删除a-d
    8. delmarks a,b,d,d 删除a,b,c,d
    9. delmarks!  删除a-z
    10. []往前或往后跳标志
    11. ‘跳到标志所在行的第一个非空字符;`跳到标志所在位置(列)
    12. 如:[‘表示跳到上一个标志所在的行;而]`表示跳到下一个标志所在的行和列;
    13. 预置标志:
      1. `. 最后修改位置
      2. `” 最后离开时的位置
      3. `0 `1 `2 最后一次打开的文件的位置,1是再往前,2依次
      4. ‘’ 最后一次的位置(行)
      5. “最后一次的位置(行+列)
      6. `[  `]最后修改或最后选择的位置
      7. `< `>可视化的选择区域位置
  5. 查找
    1. /是向下查找(前进)
    2. ?是向上查找(回退)
    3. n是重复上一次的查找;N是重复上一次的查找但反向;
    4. /不带参数为重复上一次的。 ?也是同样。
    5. //或??可使用上一次的查找pattern,但提供新的offset参数,一般没用。
    6.  
  6. 查找替换
    1. s/A/B/g      当前行替换所有A为B
    2. %s/A/B/g     所有行(%的作用就是这个)查找替换所有A为B
    3. 5,10s/A/B/g     仅查找替换5~10行
    4. ‘<,’>s/A/Bg      可视模式下的选区内替换:进入可视化模式后,输入:就会自动补全前面的’<,’>
      1. 单引号开头的表示一个标志(mark),如何增加标志参考其它内容;
    5. .,+2s/A/B/g    当前行与接下来的两行
    6. .$s/A/B/g   当前和
    7. 查找与替换范围
      1. s 当前行
      2. %s  所有行
      3. 5,10   第 5~10行
      4. .,+2   当前行及之后的2行(不包括当前行)
      5. .,$   当前行至文件尾
      6. ^,. 
      7.  
    8. 替换标志
      1. /g 全局替换,不带此标志此仅替换第一个;
      2. /c 替换前确认
      3. /i  /I 大写为大小写敏感;小写为不敏感;也可以在A后增加\c 或\C标志;
        1. 例如   %s/A/B/gI    与%s/A\C/B/g 效果相同
  7. 查找替换
    1. 查找内容的匹配
      1. 可使用\zs \ze来匹配需要替换的串;这里与正则表达式中的()的用法类似,但仅限其中一个;例如:
        1. :s/Copyright \zs2007\ze all rights reserved/2008 只仅替换其中的2007为2008,而不会替换其它内容;
      2. //忽略查找内容串,则使用最后一次的查找规则;
      3.  
    2. 查找范围
    3. 替换范围
    4.  
  8. 特殊字符的处理:
    1. \r 换行
    2. \n 表示null
    3. \0 表示整个匹配字符串的内容
    4. \1 \2 … 表示表达式中括号里的内容,按顺序匹配;
    5. \& 
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

群晖6.1.7移除系统升级小红点提示

运行在ESXi的群晖引导只支持到6.1.7,又不想要麻烦搞复杂的升级,就到网上找了个教程:

https://club.hdtimes.cn/thread-29191-1-1.html

大意是修改CSS文件(/usr/syno/synoman/synoSDSjslib/sds.css文件),新增如下内容:

.sds-application-notify-badge-num {display:none!important;}

这段代码的缺点是:移除了所有的红点,包括包管理的升级提示,而这些是没有影响的。

自己完善一下:

/* 去除桌面提示小红点 */
li[aria-label=”Control Panel”] .sds-application-notify-badge-num {display:none!important;}
li[aria-label=”控制面板”] .sds-application-notify-badge-num {display:none!important;}

这样就只有控制面板的红点被移除了:)

前面增加的规则是为了找到控制面板的红点,之所以要两条是同时匹配中文和英文两种界面的情形,如果是其它语言的就请自己加。

也可以用正则表达式去匹配图片名称从而避免多条规则:)这样只用一条规则能搞定所有语言。

Continue Reading

Linux编译安装

编译准备

提前做好如下准备:

  1. 下载gcc/gcc+/cmake等编译工具
  2. 检查并安装软件对应的开发库,如:zlib expat等;
  3. 以下常用库的说明:
    1. zlib
    2. expat
    3. 待补充
  4. 使用以下简单的术语:
    1. 二进制文件:编译后生成的可执行文件(bin)、库文件(lib)、资源文件(res)(包括图片、图标等);
    2. 配置文件:编译后生成的配置文件(etc),类似xxx.conf的文件,一般存放到/etc或等目录;

编译步骤

  1. 配置configure
    1. configure是一个脚本,根据当前的平台,已有编译器的类型,生成makefile文件,即编译文件;
    2. 通过configure -h(–help)查看相应的帮助;
    3. -V 查看版本
    4. –prefix=/path/to/destination 编译后的二进制文件(bin/lib/res)安装目录
    5. –sysconfigdir=/path/to/etc 编译后的配置文件(etc)目录;注意虽然一般有此配置项,但很多软件,尤其是库实际上并没有etc文件;
    6. –with-arp=/path/to/apr 这是指定apache portable run-time Libraries;根据网络需要可能会有其它特殊参数需要指定;此参数并非编译的通用参数。
    7. –with-expat=buildin 使用内置的expat库;也是对部分编译可能有用;
    8. Makefile是configure成功之后生成的文件
    9. Makefile.in是预选准备的Makefile模板
    10. –prefix等参数可能未写入Makefile文件,如:httpd的参数写入了config.nice文件;
    11. 部分软件可能是没有configure脚本的,此时只能使用自带的Makefile编译,如:Redis5;
  2. 编译 make
    1. make执行前先执行./configure;
    2. 遇到错误时,可以先尝试make clean再试;
    3. make clean是make命令的内置功能,无需Makefile中有相应的配置;
    4. make clean操作理论不删除Makefile,即不影响./configure的结
    5. 编译完成后,通过make test测试编译结果,正常时一般会显示All tests passed;注意:这并不一定是最后一行!!
    6. 根据Makefile文件的内容,不是所有的软件都有test指令,如apache httpd 2.4就没有;此时需要特别关注make的输出;
  3. 安装make install
    1. 删除make uninstall 注意,这并非标准操作,大多数软件可能没有此功能;

其它说明

  1. yum/apt-get等一般安装到/usr目录,即可执行文件位于/usr/bin目录;
  2. 通过本文方案自行编译的文件,默认安装到/usr/local目录,即可执行文件位于/usr/local/bin目录;
  3. /opt目录于用于自行下载的或通过./configure –prefix=/opt/xxxx指定的三方软件目录;
  4. ./configure脚本的用途是生成Makefile文件,其中可以包含多个指令,如:install uninstall
  5. make命令则相当于执行Makefile中所包含的指令。

Continue Reading

Apache 403错误

升级到Apache2.4后,突然提示这个,按网上的教程把/etc/httpd/conf/httpd.conf以及虚拟机的配置文件都检查改了一轮,在所有的配置文件中与该虚拟主机相关的:‘

order allow,deny
allow from all

统一修改为:

Require all granted

结果发现仍然提示404,其中发现html页面一切正常,但凡php提示403,最终找到错误的原因是在虚拟主机的各个目录下都生成了.htaccess文件,而其中的内容是如下的:

<FilesMatch ".(py|exe|phtml|php|PhP|php5|suspected)$">
Order Allow,Deny
Deny from all
</FilesMatch>

修改虚拟主机根目录下的.htaccess文件,站点打开了,但需要注意的是在子目录,如wp-content/wp-admin下仍有.htaccess文件,并且内容大体一致,根据需要(是否需要访问上述后缀的文件)来判断是否需要修改。

可能以前写过:
1. 在各个配置文件中directories的配置是各自配置的,更底层的目录肯定有更高的优先级;也就是说配置/或/var目录是禁止访问的,同时配置/var/www目录允许访问,则此时是允许的;

Continue Reading
1 2 3 14