让建站变得简单。无暴躁，不编程，我爱暴躁，我爱编程，编程使我暴躁。精通PHP、PYTHON、C、C++、Java、C#、VB、HTML、Delphi、JavaScript、PHP等语言的拼写,熟练PhotoShop、Illustrator CS、CorelDraw、Flash CS、AutoCAD、Office等软件的卸载,掌握Windows Server、Unix、Lunix等操作系统的关机
有时候辛辛苦苦写的前端被人源码拷贝，目前js端常用的防止别人拷贝源码就是用混淆加密找到个线上工具还不错混淆加密工具用法在js编写好后，把代码粘贴进去，混淆加密，然后新保存个js,线上的用新的js，源码本地留存就行，变了名全都替换了，还原还是要花些功夫的。说明对外暴露的函数或者接口，需要在不混淆变量名称里面增加，否则外面不知道变量名是啥。
网 上有不少mysql 性能优化方案，不过，mysql的优化同sql server相比，更为麻烦与复杂，同样的设置，在不同的环境下 ，由于内存，访问量，读写频率，数据差异等等情况，可能会出现不同的结果，因此简单地根据某个给出方案来配置mysql是行不通的，最好能使用 status信息对mysql进行具体的优化。mysql> show global status; 可以列出mysql服务器运行各种状态值，另外，查询mysql服务器配置信息语句：mysql> show variables;一、慢查询mysql> show variables like 'slow%';variable_name valuelog_slow_querieson slow_launch_time2 mysql> show global status like 'slow%';variable_name valueslow_launch_threads0 slow_queries 4148+---------------------+-------+ 配 置中打开了记录慢查询，执行时间超过2秒的即为慢查询，系统显示有4148个慢查询，你可以分析慢查询日志，找出有问题的sql语句，慢查询时间不宜设置 过长，否则意义不大，最好在5秒以内，如果你需要微秒级别的慢查询，可以考虑给mysql打补丁：http://www.percona.com /docs/wiki/release:start，记得找对应的版本。打开慢查询日志可能会对系统性能有一点点影响，如果你的mysql是主－从结构，可以考虑打开其中一台从服务器的慢查询日志，这样既可以监控慢查询，对系统性能影响又小。二、连接数经 常会遇见”mysql: error 1040: too many connections”的情况，一种是访问量确实很高，mysql服务器抗不住，这个时候就要考虑增加从服务器分散读压力，另外一种情况是mysql配 置文件中max_connections值过小：mysql> show variables like 'max_connections';variable_name valuemax_connections256 这台mysql服务器最大连接数是256，然后查询一下服务器响应的最大连接数：mysql> show global status like 'max_used_connections';mysql服务器过去的最大连接数是245，没有达到服务器连接数上限256，应该没有出现1040错误，比较理想的设置是max_used_connections / max_connections * 100% ≈ 85%最大连接数占上限连接数的85％左右，如果发现比例在10%以下，mysql服务器连接数上限设置的过高了。三、key_buffer_sizekey_buffer_size是对myisam表性能影响最大的一个参数，下面一台以myisam为主要存储引擎服务器的配置：mysql> show variables like 'key_buffer_size';variable_name value key_buffer_size536870912分配了512mb内存给key_buffer_size，我们再看一下key_buffer_size的使用情况：mysql> show global status like 'key_read%';variable_name value key_read_requests 27813678764key_reads 6798830 一共有27813678764个索引读取请求，有6798830个请求在内存中没有找到直接从硬盘读取索引，计算索引未命中缓存的概率：key_cache_miss_rate ＝ key_reads / key_read_requests * 100%比 如上面的数据，key_cache_miss_rate为0.0244%，4000个索引读取请求才有一个直接读硬盘，已经很bt 了，key_cache_miss_rate在0.1%以下都很好（每1000个请求有一个直接读硬盘），如果key_cache_miss_rate在 0.01%以下的话，key_buffer_size分配的过多，可以适当减少。mysql服务器还提供了key_blocks_*参数：mysql> show global status like 'key_blocks_u%';variable_name value key_blocks_unused 0 key_blocks_used 413543 key_blocks_unused 表示未使用的缓存簇(blocks)数，key_blocks_used表示曾经用到的最大的blocks数，比如这台服务器，所有的缓存都用到了，要么 增加key_buffer_size，要么就是过渡索引了，把缓存占满了。比较理想的设置：key_blocks_used / (key_blocks_unused + key_blocks_used) * 100% ≈ 80%四、临时表mysql> show global status like 'created_tmp%';variable_name value created_tmp_disk_tables21197 created_tmp_files 58 created_tmp_tables 1771587每次创建临时表，created_tmp_tables增加，如果是在磁盘上创建临时表，created_tmp_disk_tables也增加,created_tmp_files表示mysql服务创建的临时文件文件数，比较理想的配置是： created_tmp_disk_tables / created_tmp_tables 100% <= 25%比如上面的服务器created_tmp_disk_tables / created_tmp_tables 100% ＝ 1.20%，应该相当好了。我们再看一下mysql服务器对临时表的配置：mysql> show variables where variable_name in ('tmp_table_size', 'max_heap_table_size');variable_name value max_heap_table_size268435456tmp_table_size 536870912只有256mb以下的临时表才能全部放内存，超过的就会用到硬盘临时表。五、open table情况mysql> show global status like 'open%tables%';variable_namevalueopen_tables 919 opened_tables1951 open_tables 表示打开表的数量，opened_tables表示打开过的表数量，如果opened_tables数量过大，说明配置中 table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小，我们查询一下服务器table_cache值：mysql> show variables like 'table_cache';variable_namevaluetable_cache 2048 比较合适的值为：open_tables / opened_tables * 100% >= 85%open_tables / table_cache * 100% <= 95%六、进程使用情况mysql> show global status like 'thread%';variable_name valuethreads_cached 46 threads_connected2 threads_created 570 threads_running 1 如 果我们在mysql服务器配置文件中设置了thread_cache_size，当客户端断开之后，服务器处理此客户的线程将会缓存起来以响应下一个客户 而不是销毁（前提是缓存数未达上限）。threads_created表示创建过的线程数，如果发现threads_created值过大的话，表明 mysql服务器一直在创建线程，这也是比较耗资源，可以适当增加配置文件中thread_cache_size值，查询服务器 thread_cache_size配置：mysql> show variables like 'thread_cache_size';variable_name valuethread_cache_size64 示例中的服务器还是挺健康的。七、查询缓存(query cache)mysql> show global status like 'qcache%';variable_name value qcache_free_blocks 22756 qcache_free_memory 76764704 qcache_hits 213028692qcache_inserts 208894227qcache_lowmem_prunes 4010916 qcache_not_cached 13385031 qcache_queries_in_cache43560 qcache_total_blocks 111212 mysql查询缓存变量解释：qcache_free_blocks：缓存中相邻内存块的个数。数目大说明可能有碎片。flush query cache会对缓存中的碎片进行整理，从而得到一个空闲块。qcache_free_memory：缓存中的空闲内存。qcache_hits：每次查询在缓存中命中时就增大qcache_inserts：每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。qcache_lowmem_prunes： 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看；如果这个数字在不断增长，就表示可能碎片非常严重，或者内存 很少。（上面的 free_blocks和free_memory可以告诉您属于哪种情况）qcache_not_cached：不适合进行缓存的查询的数量，通常是由于这些查询不是 select 语句或者用了now()之类的函数。qcache_queries_in_cache：当前缓存的查询（和响应）的数量。qcache_total_blocks：缓存中块的数量。我们再查询一下服务器关于query_cache的配置：mysql> show variables like 'query_cache%';variable_name value query_cache_limit 2097152 query_cache_min_res_unit 4096 query_cache_size 203423744query_cache_type on query_cache_wlock_invalidateoff 各字段的解释：query_cache_limit：超过此大小的查询将不缓存query_cache_min_res_unit：缓存块的最小大小query_cache_size：查询缓存大小query_cache_type：缓存类型，决定缓存什么样的查询，示例中表示不缓存 select sql_no_cache 查询query_cache_wlock_invalidate：当有其他客户端正在对myisam表进行写操作时，如果查询在query cache中，是否返回cache结果还是等写操作完成再读表获取结果。query_cache_min_res_unit的配置是一柄”双刃剑”，默认是4kb，设置值大对大数据查询有好处，但如果你的查询都是小数据查询，就容易造成内存碎片和浪费。查询缓存碎片率 = qcache_free_blocks / qcache_total_blocks * 100%如果查询缓存碎片率超过20%，可以用flush query cache整理缓存碎片，或者试试减小query_cache_min_res_unit，如果你的查询都是小数据量的话。查询缓存利用率 = (query_cache_size - qcache_free_memory) / query_cache_size * 100%查询缓存利用率在25%以下的话说明query_cache_size设置的过大，可适当减小；查询缓存利用率在80％以上而且qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小，要不就是碎片太多。查询缓存命中率 = (qcache_hits - qcache_inserts) / qcache_hits * 100%示例服务器 查询缓存碎片率 ＝ 20.46％，查询缓存利用率 ＝ 62.26％，查询缓存命中率 ＝ 1.94％，命中率很差，可能写操作比较频繁吧，而且可能有些碎片。八、排序使用情况mysql> show global status like 'sort%';variable_name value sort_merge_passes29 sort_range 37432840 sort_rows 9178691532sort_scan 1860569 sort_merge_passes 包括两步。mysql 首先会尝试在内存中做排序，使用的内存大小由系统变量 sort_buffer_size 决定，如果它的大小不够把所有的记录都读到内存中，mysql 就会把每次在内存中排序的结果存到临时文件中，等 mysql 找到所有记录之后，再把临时文件中的记录做一次排序。这再次排序就会增加 sort_merge_passes。实际上，mysql 会用另一个临时文件来存再次排序的结果，所以通常会看到 sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件，所以速度可能会比较慢，增加 sort_buffer_size 会减少 sort_merge_passes 和 创建临时文件的次数。但盲目的增加 sort_buffer_size 并不一定能提高速度，见 how fast can you sort data with mysql?（引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html，貌似被墙）另外，增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值对排序的操作也有一点的好处，参见：http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/九、文件打开数(open_files)mysql> show global status like 'open_files';variable_namevalueopen_files 1410 mysql> show variables like 'open_files_limit';variable_name valueopen_files_limit4590 比较合适的设置：open_files / open_files_limit * 100% <= 75％十、表锁情况mysql> show global status like 'table_locks%';variable_name value table_locks_immediate490206328table_locks_waited 2084912 table_locks_immediate表示立即释放表锁数，table_locks_waited表示需要等待的表锁数，如果 table_locks_immediate / table_locks_waited > 5000，最好采用innodb引擎，因为innodb是行锁而myisam是表锁，对于高并发写入的应用innodb效果会好些。示例中的服务器 table_locks_immediate / table_locks_waited ＝ 235，myisam就足够了。十一、表扫描情况mysql> show global status like 'handler_read%';variable_name value handler_read_first 5803750 handler_read_key 6049319850 handler_read_next 94440908210handler_read_prev 34822001724handler_read_rnd 405482605 handler_read_rnd_next18912877839各字段解释参见http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html，调出服务器完成的查询请求次数：mysql> show global status like 'com_select';variable_namevalue com_select 222693559计算表扫描率：表扫描率 ＝ handler_read_rnd_next / com_select如果表扫描率超过4000，说明进行了太多表扫描，很有可能索引没有建好，增加read_buffer_size值会有一些好处，但最好不要超过8mb。后记：文中提到一些数字都是参考值，了解基本原理就可以，除了mysql提供的各种status值外，操作系统的一些性能指标也很重要，比如常用的top,iostat等，尤其是iostat，现在的系统瓶颈一般都在磁盘io上，关于iostat的使用，可以参考：http://www.php-oa.com/2009/02/03/iostat.html
1.操作系统需要两种CPU状态：内核态（Kernel Mode）：运行操作系统程序用户态（User Mode）：运行用户程序2.指令划分：特权指令：只能由操作系统使用、用户程序不能使用的指令。 举例：启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机非特权指令：用户程序可以使用的指令。 举例：控制转移 算数运算 取数指令 访管指令（使用户程序从用户态陷入内核态）3.特权级别：特权环：R0、R1、R2和R3R0相当于内核态，R3相当于用户态；不同级别能够运行不同的指令集合；4.CPU状态之间的转换：用户态--->内核态：唯一途径是通过中断、异常、陷入机制（访管指令）内核态--->用户态：设置程序状态字PSW5.内核态与用户态的区别：1）内核态与用户态是操作系统的两种运行级别，当程序运行在3级特权级上时，就可以称之为运行在用户态。因为这是最低特权级，是普通的用户进程运行的特权级，大部分用户直接面对的程序都是运行在用户态；2）当程序运行在0级特权级上时，就可以称之为运行在内核态。3）运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时，大部分时间是运行在用户态下的，在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。4）这两种状态的主要差别是：处于用户态执行时，进程所能访问的内存空间和对象受到限制，其所处于占有的处理机是可被抢占的 ；而处于核心态执行中的进程，则能访问所有的内存空间和对象，且所占有的处理机是不允许被抢占的。通常来说，以下三种情况会导致用户态到内核态的切换：1）系统调用这是用户态进程主动要求切换到内核态的一种方式，用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现，例如Linux的int 80h中断。2）异常当CPU在执行运行在用户态下的程序时，发生了某些事先不可知的异常，这时会触发由当前运行进程切换到处理此异常的内核相关程序中，也就转到了内核态，比如缺页异常。3）外围设备的中断当外围设备完成用户请求的操作后，会向CPU发出相应的中断信号，这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序，如果先前执行的指令是用户态下的程序，那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成，系统会切换到硬盘读写的中断处理程序中执行后续操作等。这3种方式是系统在运行时由用户态转到内核态的最主要方式，其中系统调用可以认为是用户进程主动发起的，异常和外围设备中断则是被动的。
具体步骤如下：1.到Adobe官网下载FlashBuilder 4.6，有简体中文版；语言：简体中文(Simplified)http://trials3.adobe.com/AdobeProducts/FLBR/4_6/win32/FlashBuilder_4_6_LS10.exe2.安装时，不用序列号，直接选择安装试用版；3.安装完成后在安装目录下依次修改下列3个文件：(1).eclipsepluginscom.adobe.flexbuilder.project_4.6.0.328916META-INF下面的MANIFEST.MF修改：Bundle-Version: 0.0.0(2).eclipsefeaturescom.adobe.flexide.feature_4.6.0.328916下面的feature.xml修改：<plugin id="com.adobe.flexbuilder.project" download-size="0" install-size="0" version="0.0.0"/> (3).eclipsepluginscom.adobe.flexbuilder.flex_4.6.0.328916下面：复制config.xml并重命名为config_builder.xml注：以上紫色文字部分为具体的版本号，请跟据实际版本号进行查找修改完成之后，再启动Adobe Flash Builder 4.6，恭喜你，你会发现自己彻底拥有了这款RIA工具了。
刚使用IntelliJ IDEA的时候还不熟，很多新手都不知道怎么给现有项目增加相应的包jar，导致项目不能运行，xml配置导出是红色错误。编辑器File -> Project Structure.. -> Modules -> 中间栏，鼠标右键->add+ > 选择相应包，然后跟着提示完成
之前看了Spring可以通过xml配置实现beans的依赖注入，所有class的元数据和依赖通过xml配置会让配置越来越多，越来越复杂。从Spring2.5开始，可以通过注解完成之前xml完成的事情，注意：注解不是注释！！！！启用注解启用注解需要在配置中增加几项配置<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config/> </beans>注解必学和理解的几个注解@Required@Autowired@QualifierJSR-250 Annotations详细看 《w3cschool Spring 基于注解的配置》基于 Java 的配置这个东西持保留意见，可能是为了些更灵活的应用场景Spring的事件处理 和自定义事件这个没什么好说的，就是在beans的生命周期中的各个节点增加些事件触发，具体的看示例更好看懂 w3cschool Spring 中的事件处理
什么是依赖注入从博主的理解就是，一般情况下我们创建对象会直接用new加上类名创建，这样写文件与文件之间有较强的耦合，项目class越来越多，文件之间相互依赖使得系统无法升级和更改。 那么我们要获取一个对象，又要保持系统的耦合度低怎么做呢，就是把对象传入需要用到的地方，而这个传入的对象，是依赖于配置进行自动化生成的，对使用者透明，使用对象的人无需关心这个对象从哪儿来，无需去配置一堆相关初始化参数。即使类被更改，使用者的代码也无需做任何更改和变动。把整个类创建，初始化，注入到类，完全交给个容器完成，完成控制反转，这个就是依赖注入。简单来说就是不需要new一个对象，而是通过参数传递进来，而这个对象的创建和初始化交个容器找相关配置完成。Spring的依赖注入两种方式构造函数、设置函数构造函数顾名思义，就是这些依赖的对象，通过构造函数的参数进行传入，xml配置通过以下2种方式配置：类依赖：<constructor-arg ref="bar"/>值依赖：<contructor-args type="" value=""/> 设置函数顾明思议就是通过函数进行注入依赖，xml通过以下方式配置：类依赖： 值依赖： 其他内部beans定义在类范围内 注入集合有时候注入的值可能是个集合 <set> <props>元素描述 它有助于连线，如注入一列值，允许重复。<set>它有助于连线一组值，但不能重复。 它可以用来注入名称-值对的集合，其中名称和值可以是任何类型。<props>它可以用来注入名称-值对的集合，其中名称和值都是字符串类型。xml配置： INDIA Pakistan USA USA Spring beans的自动装配无需编写xml,自动适配，使用autowire属性，有5种模式模式描述no这是默认的设置，它意味着没有自动装配，你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。byName由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配，并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。byType由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称，它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean，则一个致命的异常将会被抛出。constructor类似于 byType，但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean，则一个致命错误将会发生。autodetectSpring首先尝试通过 constructor 使用自动装配来连接，如果它不执行，Spring 尝试通过 byType 来自动装配。
网上很多关于Spring Ioc容器的文章和教程，本文记录下博主学Spring的时候对Spring容器的理解和认识，后面随着深入的了解和应用可能有更新。什么是容器个人理解，容器就是个黑盒子工厂，作用就是：创建对象，初始化对象的参数，然后其他地方需要用到这些对象都从这个黑盒子里面取，这些对象被称为Spring Beans。 当然里面涉及到很多细节，比如元数据通过xml、注释、代码等方式获取（元数据就是实例化对象的时候传的参数），容器还会做比如对象生命周期的管理、依赖注入管理组件等等。容器具体有哪些Pring提供了2种不同类型的容器1.BeanFactory 简单容器 2.ApplicationContext 包含BeanFactory的功能，还提供更多功能 （一般使用这个） 什么是BeansJavaBeans是一个接口规范，JavaBeans是一个Java的类，一般来说，这样的Java类将对应于一个独立的 .java文件，遵循以下规范：1.有一个public默认构造器（例如无参构造器,）属性使用public 的get，set方法访问，也就是说设置成private， 2.同时get，set方法与属性名的大小也需要对应。例如属性name，get方法就要写成，public String getName(){},N大写。 3.需要序列化。这个是框架，工具跨平台反映状态必须的 Spring Beans就是这些类的实例化对象。如何定义 Bean之前说了可以通过xml、注释、代码等方式，下面介绍xml方式，注释后面再说，还没学到在 src目录下面的xml配置文件中，定义一个bean 至少需要一个id或name, 然后一个class,<?xml version="1.0" encoding="UTF-8"?> bean的属性上可以有一些参数可以控制作用域，创建，销毁等,比如：scope、init-method、lazy-init、destroy-method等等，具体参数和作用看教程吧，不赘述了，<<w3cschool教程地址>> 可以对类里面的参数进行赋值，定义的这个就叫元数据 <property name="message" value="Hello World" /> 这个message就对应着HelloWorld.java 的 messages属性（注意message是private，需要设置set方法 setMessage()）bean也可以继承ok,Spring容器和容器创建的Spring bean就理解到这里
java扫盲系列（1）-POM(Project Object Model) 项目对象模型
一、什么是POMProject Object Model，项目对象模型。通过xml格式保存的pom.xml文件。作用类似ant的build.xml文件，功能更强大。该文件用于管理：源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。一个完整的pom.xml文件，放置在项目的根目录下。 4.0.0 <!– The Basics –> … … … … … … … … … <!– Build Settings –> … … <!– More Project Information –> … … … … … … … … <!– Environment Settings –> … … … … … … … <distributionManagement>…</distributionManagement> … 二、基本设置1、maven的协作相关属性 4.0.0 org.codehaus.mojo my-project 1.0 war groupId : 组织标识，例如：org.codehaus.mojo，在M2_REPO目录下，将是: org/codehaus/mojo目录。artifactId : 项目名称，例如：my-project，在M2_REPO目录下，将是：org/codehaus/mojo/my-project目录。version : 版本号，例如：1.0，在M2_REPO目录下，将是：org/codehaus/mojo/my-project/1.0目录。packaging : 打包的格式，可以为：pom , jar , maven-plugin , ejb , war , ear , rar , par2、POM之间的关系主要用于POM文件的复用。a）依赖关系：依赖关系列表（dependency list）是POM的重要部分 junit junit 4.0 test … groupId , artifactId , version :scope : compile(default),provided,runtime,test,systemexclusionsb）继承关系：继承其他pom.xml配置的机制。比如父pom.xml： [...] junit junit 4.4 test [...] 在子pom.xml文件继承它的依赖（还可以继承其他的：developers and contributors、plugin lists、reports lists、plugin executions with matching ids、plugin configuration）：[...] com.devzuz.mvnbook.proficio proficio 1.0-SNAPSHOT [...]在这种机制下，maven还提供了一个类似java.lang.Object的顶级父pom.xml文件： 4.0.0 Maven Default Project central Maven Repository Switchboard default http://repo1.maven.org/maven2 false central Maven Plugin Repository http://repo1.maven.org/maven2 default false never target target/classes ${project.artifactId}-${project.version} target/test-classes src/main/java src/main/scripts src/test/java src/main/resources src/test/resources maven-antrun-plugin 1.1 maven-assembly-plugin 2.2-beta-2 maven-clean-plugin 2.2 maven-compiler-plugin 2.0.2 maven-dependency-plugin 2.0 maven-deploy-plugin 2.3 maven-ear-plugin 2.3.1 maven-ejb-plugin 2.1 maven-install-plugin 2.2 maven-jar-plugin 2.2 maven-javadoc-plugin 2.4 maven-plugin-plugin 2.4.1 maven-rar-plugin 2.2 maven-release-plugin 2.0-beta-7 maven-resources-plugin 2.2 maven-site-plugin 2.0-beta-6 maven-source-plugin 2.0.4 maven-surefire-plugin 2.4.2 maven-war-plugin 2.1-alpha-1 target/site release-profile performRelease true true org.apache.maven.plugins maven-source-plugin attach-sources jar true org.apache.maven.plugins maven-javadoc-plugin attach-javadocs jar true org.apache.maven.plugins maven-deploy-plugin true 可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响：mvn help:effective-pom c）聚合关系：用于将多个maven项目聚合为一个大的项目。 4.0.0 org.codehaus.mojo my-parent 2.0 <module>my-project<module> 3、属性maven的属性，是值的占位符，类似EL，类似ant的属性，比如${X}，可用于pom文件任何赋值的位置。有以下分类：1. env.X：操作系统环境变量，比如${env.PATH} 2. project.x：pom文件中的属性，比如： 1.0 ，引用方式：${project.version} 3. settings.x：settings.xml文件中的属性，比如： false ，引用方式：${settings.offline} 4. Java System Properties：java.lang.System.getProperties()中的属性，比如java.home，引用方式：${java.home} 5. 自定义：在pom文件中可以： c:/apps/cargo-installs ，引用方式：${installDir} 4、构建设置构建有两种build标签： … <!– "Project Build" contains more elements than just the BaseBuild set –> … <!– "Profile Build" contains a subset of "Project Build"s elements –> … build中的主要标签：Resources和Plugins。Resources：用于排除或包含某些资源文件 META-INF/plexus false ${basedir}/src/main/plexus configuration.xml **/*.properties Plugins：设置构建的插件 … org.apache.maven.plugins maven-jar-plugin 2.0 false true test … … 原文链接：pom.xml详解