Java 1.8新建Maven SSM项目笔记(二)

Maven新建项目的本地资源化

Apache Maven是当今非常流行的项目构建和管理工具,它把开发人员从繁杂的项目依赖关系处理事务中解放出来,完全自动化管理依赖问题。在Web应用开发过程中,通常我们会用到maven的archetype插件来生成项目框架,例如:

mvn archetype:generate -DgroupId=com.yourhost.app -DartifactId=your-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

但通常这个过程是虐心的。

现象:

用maven构建项目骨架时,速度非常慢,无论是在命令行中直接使用,还是在IDE中使用。如果再加上网络不好,那就更难熬了,喝完三杯咖啡都不见得能看到构建结果。以我的经验,很多时候都要30分钟左右…………

原因:

要了解其中的原因,需要知道maven是如何运作的。构建过程中,我们只是向maven提供了一些groupId、artifactId、archetypeArtifactId等信息,只有这些信息的情况下maven是如何构建出整个项目的呢?它的知识来源于哪里呢?答案是:

http://repo.maven.org/maven2/archetype-catalog.xml

这里记录了,所有archetype构建信息,maven通过archetype插件构建项目骨架时会远程访问页面,通过maven的-X参数可以证明这一点。

.............[DEBUG] -- end configuration -- [INFO] Generating project in Batch mode [DEBUG] Searching for remote catalog: http://repo.maven.apache.org/maven2/archetype-catalog.xml (通常就卡在这一步长达25+分钟)..............

直接在浏览器打开这个链接的速度一样非常慢。打开后通过浏览器的查看源码功能,如下所示:

<?xml version="1.0" encoding="UTF-8"?><archetype-catalog>    <archetypes>        <archetype>            <groupId>am.ik.archetype</groupId>            <artifactId>maven-reactjs-blank-archetype</artifactId>            <version>1.0.0</version>            <description>Blank Project for React.js</description>        </archetype>        <archetype>            <groupId>am.ik.archetype</groupId>            <artifactId>msgpack-rpc-jersey-blank-archetype</artifactId>            <version>1.0.7</version>            <description>Blank Project for Spring Boot + Jersey</description>        </archetype>        <archetype>            <groupId>am.ik.archetype</groupId>            <artifactId>msgpack-rpc-jersey-blank-archetype</artifactId>            <version>1.0.6</version>            <description>Blank Project for Spring Boot + Jersey</description>        </archetype>        <archetype>            <groupId>am.ik.archetype</groupId>            <artifactId>msgpack-rpc-jersey-blank-archetype</artifactId>            <version>1.0.5</version>            <description>Blank Project for Spring Boot + Jersey</description>        </archetype>        <archetype>            <groupId>am.ik.archetype</groupId>            <artifactId>msgpack-rpc-jersey-blank-archetype</artifactId>            <version>1.0.2</version>            <description>Blank Project for Spring Boot + Jersey</description>        </archetype>            ...................            ...................以下省略13W行......

复制文件到编辑器可知,文件长达13W行,文件大加上网络原因,导致访问速度很慢。

解决方案:

如上分析可知,是由于achetype-catalog.xml文件的访问问题,导致了整个构建过程的缓慢,所以是否能够将文件保存到本地,成为一种解决思路。翻阅Maven官方文档可以找到,确实是可以的。官方链接如下:

http://maven.apache.org/archetype/maven-archetype-plugin/specification/archetype-catalog.html

按照如下步骤:

      1)准备archetype-catalog.xml文件

            方式1:通过浏览器查看http://repo.maven.org/maven2/archetype-catalog.xml页源码,复制到本地,命名为archetype-catalog.xml。

            方式2:通过命令行  curl http://repo.maven.org/maven2/archetype-catalog.xml > archetype-catalog.xml

      2)将上述文件放置到maven的默认路径下

            注意,这不是指的安装路径,而是mvn运行时默认的存放repository的路径,一般在用户根目录下的一个隐藏目录,~/.m2。如果做过更改,可以在maven的设置文件中查看             具体在哪个位置,设置文件在maven安装目录/config/settings.xml中。

      3)在构建时,在archetype:generate后加上 -DarchetypeCatalog=local参数。

解决,Have fun!再次尝试构建项目骨架,飞一般的感觉。

参考资料:

http://maven.apache.org/archetype/maven-archetype-plugin/specification/archetype-catalog.html


如果还是想在IDE里面建立maven项目,又想利用本地文件加快速度,可以按照以下方法操作:

Step 1: 在”Window (菜单项目)”上左键单击”Preferences (菜单项目)”

Step 2: 在”Archetypes (树项目)”上左键单击

Step 3: 在Maven Archetype catalogs列表”上左键单击

Step 4: 在”Add Local Catalog… (按钮)”上左键单击

Step 5:在”Browse… (按钮)”上左键单击

Step 6: 在”Select Archetype catalog”中左键单击

Step 7: 在”名称 (编辑)”上左键单击

Step 8: 在”打开(O) (按钮)”上左键单击,选择下载后的文件

Step 9:单击OK (按钮)

Step 10:单击Apply按钮

Step 11: 单击OK (按钮

 

Step 12: 在空白处右键单击,选择”New -> Other”

Read More

Java 1.8新建Maven SSM项目笔记(三)

高版本Java下Maven编译项目

我的软件环境:Java 1.8

Dynamic Web Module 3.1

来源: http://www.cnblogs.com/zhyp/p/5635700.html

记录一下,水平太菜,花费了半天时间。

pom.xml

<build>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>
    </plugins>
</build>
  1. Another way is to edit the project facet configuration file itself: org.eclipse.wst.common.project.facet.core.xml
  2. Change the dynamic web module version in this line to 3.1 – <installed facet=”jst.web” version=”3.0″/>
  3. And then Maven -> Update Project. You’ll find this file in the .settings directory within the Eclipse project

我的环境是Java1.8,在我修改项目的Project facets之后,就已经成为1、2两点所写的样子了。但是问题依旧,所以我的步骤是

  1. 修改pom.xml
  2. 将source和target改成1.8,如下所示
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
  3. 在项目的属性中选择Maven -> Update Project.

【原创】把 Nginx 创建为 Windows 的一个服务,关联PHP服务一起启动

参考把 Nginx 创建为 Windows 的一个服务 – Defonds 的专栏 – 博客频道 – CSDN.NET,我做了以下改变:
首先编写setupPhp.bat,作为PHP服务启动关闭的程序,内容如下:
  1. @echo off
  2. if "%1" == "-start" goto start
  3. if "%1" == "-stop"  goto stop
  4. :start
  5. set PHP_FCGI_MAX_REQUESTS=1000
  6. D:/WebSrv/php/php-cgi.exe -b 127.0.0.1:9000 -c D:/WebSrv/php/php.ini
  7. goto end
  8. :stop
  9. taskkill /F /IM php-cgi.exe > nul
  10. goto end
  11. :end
接下来安装Nginx服务,需要编写XML文件。除了更改路径和上文并无不同。
installNginx.xml
  1. <service>
  2.  <id>Nginx</id>
  3.  <name>Nginx</name>
  4.  <description>Nginx是一个高性能的HTTP和反向代理服务器,也是一个邮件服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的。</description>
  5.  <executable>D:\WebSrv\nginx\nginx.exe</executable>
  6.  <logpath>D:\WebSrv\Logs\</logpath>
  7.  <logmode>roll</logmode>
  8.  <depend></depend>
  9.  <startargument>-p D:\WebSrv\nginx</startargument>
  10.  <stopargument>-p D:\WebSrv\nginx -s stop</stopargument>
  11. </service>
接下来按照PHP服务,需要编写XML文件。
installPHP.xml
  1. <service>
  2.  <id>PHP-FPM</id>
  3.  <name>PHP-FPM</name>
  4.  <description>PHP-FPM</description>
  5.  <executable>D:\WebSrv\php\setupPhp.bat</executable>
  6.  <logpath>D:\WebSrv\Logs\</logpath>
  7.  <logmode>roll</logmode>
  8.  <depend>Nginx</depend>
  9.  <startargument>-start</startargument>
  10.  <stopargument>-stop</stopargument>
  11. </service>
重要的点在depend元素。
  1. <depend>Nginx</depend>
这样启动PHP服务后,Nginx也被带着一起启动了。但试过了,如果PHP服务

Windows下搭建nginx+php+MariaDB开发环境

准备工作

Nginx 1.10.1 D:\WebSrv\nginx
PHP 5.6.23 X64版 D:\WebSrv\php
MariaDB 1.10.1 D:\WebSrv\MariaDB

注意: nginx下php是以FastCGI的方式运行,所以我们下载非线程安全也就是nts的php包

统一安装到D:\WebSrv底下。

PHP安装与配置

解压PHP压缩包到指定目录

如:

 

 

找到php.ini-development更名为php.ini并打开(建议使用Notepad2或Notepad++)

首先找到 extension_dir

 

去掉前面的分号,改为

extension_dir=”D:/wnmp/php5/ext”

接下来是一些常用扩展启用(去掉其前面的分号)

extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_sockets.dll
extension=php_sqlite.dll
extension=php_sqlite3.dll
extension=php_exif.dll

CGI设置(去掉其前面的分号)

cgi.force_redirect = 1

cgi.fix_pathinfo=1(重要,设置之后PHP文件才能被编译)

cgi.rfc2616_headers =1

PHP部分设置完成

Nginx安装与配置

解压压缩包

找到nginx.conf文件

 

打开后修改

 

包含文件 include     D:/wnmp/ww/conf/*.conf; 记得有 分号 结尾

若没有多个域名指定多个虚拟目录的需求,则修改server部分。

示例conf,只含有server部分

 

 

Server_name   xxx.xxx # 绑定域名

可以通过修改hosts文件 将域名指向本地就可以使用了

 

 

下载RunHiddenConsole:http://redmine.lighttpd.net/attachments/660/RunHiddenConsole.zip

解压到nginx目录下

RunHiddenConsole 执行的程序进程不会随着命令提示符窗口关闭而结束

创建start.bat批处理

@echo off & title 启动Nginx服务器

color 0A

REM Windows 下无效

REM set PHP_FCGI_CHILDREN=5

call stop.bat

REM 每个进程处理的最大请求数,或设置为 Windows 环境变量

set PHP_FCGI_MAX_REQUESTS=1000

echo 启动 php-5.4.19 FastCGI …

RunHiddenConsole D:/wnmp/php5/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/php5/php.ini

echo 启动 Nginx 1.4

RunHiddenConsole  D:/wnmp/nginx/nginx.exe -p D:/wnmp/nginx

echo 启动完成…

Cls

创建stop.bat批处理

@echo off & title 停止Nginx

color 0A

echo Stopping Nginx…  

taskkill /F /IM nginx.exe > nul

echo Stopping PHP FastCGI…

taskkill /F /IM php-cgi.exe > nul

Cls

 

如下: 运行start.bat

 

启动成功后如下图

 

打开浏览器

 

 

接下安装Mariadb

Mariadb安装与配置

除了指定安装目录外,按照安装顺序下一步即可。找到 my-small.ini文件打开

 

修改(添加红色部分):

[client]

#password = your_password

port = 3306

socket = /tmp/mysql.sock

default-character-set=utf8 # 字符集编码

# Here follows entries for some specific programs

# The MySQL server

[mysqld]

port = 3306

socket = /tmp/mysql.sock

# 5.5及以后版本用character_set_server=utf8 取代default-character-set=utf8  

character_set_server=utf8 # 字符集编码

collation-server=utf8_general_ci # 字符集

skip-external-locking

key_buffer_size = 16K

max_allowed_packet = 1M

table_open_cache = 4

sort_buffer_size = 64K

read_buffer_size = 256K

read_rnd_buffer_size = 256K

net_buffer_length = 2K

thread_stack = 128K

 

basedir=D:/wnmp/MySQL # MySQL安装目录

datadir=D:/wnmp/MySQL/data # 数据库文件存放目录

 

另存为my.ini

备注:

按照上面的方法开始使用nginx的时候,会跳出一个提示,说程序无法使用,这是因为我们使用的是64位的PHP,如果是32位的PHP,就不会有这个情况。

解决方法是:安装MSVC12,x86版和x64版都装,就可以解决了。

[原创]scp无需输入密码,批量拷贝数据的方法

以前觉得scp除了两端建密钥的方法,就没有无需输入密码,自动化拷贝文件的方法了

今天仔细搜索,发现还是有的,用expect,详情参见我的两个附件sh文件。
iscp.sh是循环读取文件列表中的每一行,将其中的每一行作为文件、调用scpf.sh进行scp拷贝。
scpf.sh是利用expect自动输入密码进行拷贝。
要点:
1、用[lindex $argv 0]表示参数,0表示参数的顺序,0是第一个,以此类推。
2、timeout 后面的是秒数,意味着等你设定的若干秒后进行下一步。

附件列表

 

如何在BootStrap模态框中消失后确保播放中的视频也停止播放

目前的项目需要在模态框中播放视频,但是按ESC键后,希望模态框消失,视频也停止播放。但一直无果。

首先想的是用jquery捕捉键盘事件,判断是ESC键之后,暂停播放,然后关闭模态框。
但这一想法,由于被BootStrap封装而失败。
于是想,能不能拦截BootStrap对ESC键的封装。
首先考虑,停止BootStrap自动按ESC退出的功能,于是尝试以下代码
  1. $("#myModal").modal({keyboard:false});
但这一代码使用后,对键盘事件完全无感。
于是就考虑,通过代码拦截,结果发现下面这篇文章。恍然大悟。
于是将暂停播放的代码放在关闭后的on事件的处理代码中,于是OK。
以下是原文的内容
  •  下表列出了模态框中要用到事件。这些事件可在函数中当钩子使用。
    事件 描述 实例
    show.bs.modal 在调用 show 方法后触发。
    $('#identifier').on('show.bs.modal', function () {// 执行一些动作...})
    shown.bs.modal 当模态框对用户可见时触发(将等待 CSS 过渡效果完成)。
    $('#identifier').on('shown.bs.modal', function () {// 执行一些动作...})
    hide.bs.modal 当调用 hide 实例方法时触发。
    $('#identifier').on('hide.bs.modal', function () {// 执行一些动作...})
    hidden.bs.modal 当模态框完全对用户隐藏时触发。
    $('#identifier').on('hidden.bs.modal', function () {// 执行一些动作...})

    实例

    下面的实例演示了事件的用法:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.    <title>Bootstrap 实例 - 模态框(Modal)插件事件</title>
    5.    <link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    6.    <script src="/scripts/jquery.min.js"></script>
    7.    <script src="/bootstrap/js/bootstrap.min.js"></script>
    8. </head>
    9. <body>
    10.  
    11. <h2>模态框(Modal)插件事件</h2>
    12.  
    13. <!-- 按钮触发模态框 -->
    14. <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
    15.    开始演示模态框
    16. </button>
    17.  
    18. <!-- 模态框(Modal) -->
    19. <div class="modal fade" id="myModal" tabindex="-1" role="dialog" 
    20.    aria-labelledby="myModalLabel" aria-hidden="true">
    21.    <div class="modal-dialog">
    22.       <div class="modal-content">
    23.          <div class="modal-header">
    24.             <button type="button" class="close" data-dismiss="modal" 
    25.                aria-hidden="true">×
    26.             </button>
    27.             <h4 class="modal-title" id="myModalLabel">
    28.                模态框(Modal)标题
    29.             </h4>
    30.          </div>
    31.          <div class="modal-body">
    32.             点击关闭按钮检查事件功能。
    33.          </div>
    34.          <div class="modal-footer">
    35.             <button type="button" class="btn btn-default" 
    36.                data-dismiss="modal">
    37.                关闭
    38.             </button>
    39.             <button type="button" class="btn btn-primary">
    40.                提交更改
    41.             </button>
    42.          </div>
    43.       </div><!-- /.modal-content -->
    44.    </div><!-- /.modal-dialog -->
    45. </div><!-- /.modal -->
    46. <script>
    47.    $(function () { $('#myModal').modal('hide')})});
    48. </script>
    49. <script>
    50.    $(function () { $('#myModal').on('hide.bs.modal', function () {
    51.       alert('嘿,我听说您喜欢模态框...');})
    52.    });
    53. </script>
    54.  
    55. </body>
    56. </html>