关于 Apache Maven 您不知道的 5 件事-转

2013-11-20  来源:本站原创  分类:转贴的文章  人气:2 

用 Maven 管理项目文件周期的技巧

可能您对配置文件已经很熟悉了,但是您知道可以在 Maven 中使用它们来在不同的环境中执行特定行为吗?本期 5 件事 系列 文章不单介绍 Maven 的 构建特性,也介绍了管理项目生命周期的基本工具,交付了 5 个可以提高生产效率的技巧,使您在 Maven 中管理您的应用程序更为容易。

评论:

Steven Haines, 创始人兼 CEO, GeekCap Inc.

2011 年 1 月 13 日

  • 内容

关于本系列

您觉得自己懂 Java 编程?事实是,大多数开发人员都只领会到了 Java 平台的皮毛,所学也只够应付工作。在本系列 中,Java 技术深度挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程困难。

Maven 是为 Java™ 开发人员提供的一个极为优秀的构建工具,您也可以使用它来管理您的项目生命周期。作为一个生命周期管理工具,Maven 是基于阶段操作的,而不像 Ant 是基于 “任务” 构建的。Maven 完成项目生命周期的所有阶段,包括验证、代码生成、编译、测试、打包、集成测试、安装、部署、以及项目网站创建和部署。

为了更好地理解 Maven 和传统构建工具的不同,我们来看看构建一个 JAR 文件和一个 EAR 文件的过程。使用 Ant,您可能需要定义专有任务来组装每个工件。另一方面,Maven 可以为您完成大部分工作:您只需要告诉它是一个 JAR 文件还是一个 EAR 文件,然后指示它来完成 “打包” 过程。Maven 将会找到所需的资源,然后构建文件。

在本文的 参考资料 部分,您将发现大量介绍 Maven 的入门教程。本文的 5 个技巧目的是帮助您解决即将出现的一些问题:使用 Maven 管理您的应用程序的生命周期时,将会出现的编程场景。

1. 可执行的 JAR 文件

使用 Maven 构建一个 JAR 文件比较容易:只要定义项目包装为 “jar”,然后执行包装生命周期阶段即可。但是定义一个可执行 JAR 文件却比较麻烦。采取以下步骤可以更高效:

  1. 在您定义可执行类的 JAR 的 MANIFEST.MF 文件中定义一个 main 类。(MANIFEST.MF 是包装您的应用程序时 Maven 生成的。)
  2. 找到您项目依赖的所有库。
  3. 在您的 MANIFEST.MF 文件中包含那些库,便于您的应用程序找到它们。

您可以手工进行这些操作,或者要想更高效,您可以使用两个 Maven 插件帮助您完成:maven-jar-plugin 和 maven-dependency-plugin。

maven-jar-plugin

maven-jar-plugin 可以做很多事情,但在这里,我们只对使用它来修改默认 MANIFEST.MF 文件的内容感兴趣。在您的 POM 文件的插件部分添加清单 1 所示代码:

清单 1. 使用 maven-jar-plugin 修改 MANIFEST.MF
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.mypackage.MyClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

所有 Maven 插件通过一个 <configuration> 元素公布了其配置,在本例中,maven-jar-plugin 修改它的 archive 属性,特别是存档文件的manifest 属性,它控制 MANIFEST.MF 文件的内容。包括 3 个元素:

  • addClassPath:将该元素设置为 true 告知 maven-jar-plugin 添加一个 Class-Path 元素到 MANIFEST.MF 文件,以及在 Class-Path 元素中包括所有依赖项。
  • classpathPrefix:如果您计划在同一目录下包含有您的所有依赖项,作为您将构建的 JAR,那么您可以忽略它;否则使用classpathPrefix 来指定所有依赖 JAR 文件的前缀。在清单 1 中,classpathPrefix 指出,相对存档文件,所有的依赖项应该位于 “lib” 文件夹。
  • mainClass:当用户使用 lib 命令执行 JAR 文件时,使用该元素定义将要执行的类名。

maven-dependency-plugin

当您使用这 3 个元素配置好了 MANIFEST.MF 文件之后,下一步是将所有的依赖项复制到 lib 文件夹。为此,使用 maven-dependency-plugin,如清单 2 所示:

清单 2. 使用 maven-dependency-plugin 将依赖项复制到库
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>install</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                              ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

maven-dependency-plugin 有一个 copy-dependencies,目标是将您的依赖项复制到您所选择的目录。本例中,我将依赖项复制到 build 目录下的 lib 目录(project-home/target/lib)。

将您的依赖项和修改的 MANIFEST.MF 放在适当的位置后,您就可以用一个简单的命令启动应用程序:

java -jar jarfilename.jar

回页首

2. 定制 MANIFEST.MF

虽然 maven-jar-plugin 允许您修改 MANIFEST.MF 文件的共有部分,但有时候您需要一个更个性化的 MANIFEST.MF。解决方案是双重的:

  1. 在一个 “模板” MANIFEST.MF 文件中定义您的所有定制配置。
  2. 配置 maven-jar-plugin 来使用您的 MANIFEST.MF 文件,然后使用一些 Maven 配置增强。

例如,考虑一个包含 Java 代理的 JAR 文件。要运行一个 Java 代理,需要定义 Premain-Class 和设置许可。清单 3 展示了这样一个 MANIFEST.MF 文件的内容:

清单 3. 在一个定制的 MANIFEST.MF 文件中定义 Premain-Class
Manifest-Version: 1.0
Premain-Class: com.geekcap.openapm.jvm.agent.Agent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true

清单 3 中,我已指定 Premain-Class - com.geekcap.openapm.jvm.agent.Agent 被授权许可来对类进行重定义和再转换。接下来,我更新maven-jar-plugin 代码来包含 MANIFEST.MF 文件。如清单 4 所示:

清单 4. 包含 Premain-Class
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestFile>
                          src/main/resources/META-INF/MANIFEST.MF
                        </manifestFile>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>
                              com.geekcap.openapm.ui.PerformanceAnalyzer
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Maven 3

Maven 2 已确立了它作为一种最流行和最易使用的开源 Java 生命周期管理工具的地位。Maven 3,2010 年 9 月升级为 alpha 5,带来一些期待已久的改进。在 参考资料部分寻找 Maven 的新功能。

这是一个很有趣的示例,因为它既定义了一个 Premain-Class — 允许 JAR 文件作为一个 Java 代理运行,也有一个 mainClass — 允许它作为一个可执行的 JAR 文件运行。在这个特殊的例子中,我使用 OpenAPM(我已构建的一个代码跟踪工具)来定义将被 Java 代理和一个用户界面记录的代码跟踪。简而言之,这个示例展示一个显式清单文件与动态修改相结合的力量。

回页首

3. 依赖项树

Maven 一个最有用的功能是它支持依赖项管理:您只需要定义您应用程序依赖的库,Maven 找到它们、下载它们、然后使用它们编译您的代码。

必要时,您需要知道具体依赖项的来源 — 这样您就可以找到同一个 JAR 文件的不同版本的区别和矛盾。这种情况下,您将需要防止将一个版本的 JAR 文件包含在您的构建中,但是首先您需要定位保存 JAR 的依赖项。

一旦您知道下列命令,那么定位依赖项往往是相当容易的:

mvn dependency:tree

dependency:tree 参数显示您的所有直接依赖项,然后显示所有子依赖项(以及它们的子依赖项,等等)。例如,清单 5 节选自我的一个依赖项所需要的客户端库:

清单 5. Maven 依赖项树
[INFO] ------------------------------------------------------------------------
[INFO] Building Client library for communicating with the LDE
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] com.lmt.pos:sis-client:jar:2.1.14
[INFO] +- org.codehaus.woodstox:woodstox-core-lgpl:jar:4.0.7:compile
[INFO] |  \- org.codehaus.woodstox:stax2-api:jar:3.0.1:compile
[INFO] +- org.easymock:easymockclassextension:jar:2.5.2:test
[INFO] |  +- cglib:cglib-nodep:jar:2.2:test
[INFO] |  \- org.objenesis:objenesis:jar:1.2:test

清单 5 中您可以看到 sis-client 项目需要 woodstox-core-lgpl 和 easymockclassextension 库。easymockclassextension 库反过来需要 cglib-nodep 库和 objenesis 库。如果我的 objenesis 出了问题,比如出现两个版本,1.2 和 1.3,那么这个依赖项树可能会向我显示,1.2 工件是直接由 easymockclassextension 库导入的。

dependency:tree 参数为我节省了很多调试时间,我希望对您也同样有帮助。

回页首

4. 使用配置文件

多数重大项目至少有一个核心环境,由开发相关的任务、质量保证(QA)、集成和生产组成。管理所有这些环境的挑战是配置您的构建,这必须连接到正确的数据库中,执行正确的脚本集、并为每个环境部署正确的工件。使用 Maven 配置文件让您完成这些任务,而无需为每个环境分别建立明确指令。

关键在于环境配置文件和面向任务的配置文件的合并。每个环境配置文件定义其特定的位置、脚本和服务器。因此,在我的 pox.xml 文件中,我将定义面向任务的配置文件 “deploywar”,如清单 6 所示:

清单 6. 部署配置文件
<profiles>
        <profile>
            <id>deploywar</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>net.fpic</groupId>
                        <artifactId>tomcat-deployer-plugin</artifactId>
                        <version>1.0-SNAPSHOT</version>
                        <executions>
                            <execution>
                                <id>pos</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>deploy</goal>
                                </goals>
                                <configuration>
                                    <host>${deploymentManagerRestHost}</host>
                                    <port>${deploymentManagerRestPort}</port>
                                    <username>${deploymentManagerRestUsername}</username>
                                    <password>${deploymentManagerRestPassword}</password>
                                    <artifactSource>
                                      address/target/addressservice.war
                                    </artifactSource>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

这个配置文件(通过 ID “deploywar” 区别)执行 tomcat-deployer-plugin,被配置来连接一个特定主机和端口,以及指定用户名和密码证书。所有这些信息使用变量来定义,比如 ${deploymentmanagerRestHost}。这些变量在我的 profiles.xml 文件中定义,如清单 7 所示:

清单 7. profiles.xml
<!-- Defines the development deployment information -->
        <profile>
            <id>dev</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>dev</value>
                </property>
            </activation>
            <properties>
                <deploymentManagerRestHost>10.50.50.52</deploymentManagerRestHost>
                <deploymentManagerRestPort>58090</deploymentManagerRestPort>
                <deploymentManagerRestUsername>myusername</deploymentManagerRestUsername>
                <deploymentManagerRestPassword>mypassword</deploymentManagerRestPassword>
            </properties>
        </profile>

        <!-- Defines the QA deployment information -->
        <profile>
            <id>qa</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>qa</value>
                </property>
            </activation>
            <properties>
                <deploymentManagerRestHost>10.50.50.50</deploymentManagerRestHost>
                <deploymentManagerRestPort>58090</deploymentManagerRestPort>
                <deploymentManagerRestUsername>
                  myotherusername
                </deploymentManagerRestUsername>
                <deploymentManagerRestPassword>
                  myotherpassword
                </deploymentManagerRestPassword>
            </properties>
        </profile>

部署 Maven 配置文件

清单 7 的 profiles.xml 文件中,我定义了两个配置文件,并根据 env (环境)属性的值激活它们。如果 env 属性被设置为 dev,则使用开发部署信息。如果 env 属性被设置为 qa,那么将使用 QA 部署信息,等等。

这是部署文件的命令:

mvn -Pdeploywar -Denv=dev clean install

-Pdeploywar 标记通知要明确包含 deploywar 配置文件。-Denv=dev 语句创建一个名为 env 的系统属性,并将其值设为 dev,这激活了开发配置。传递 -Denv=qa 将激活 QA 配置。

回页首

5. 定制 Maven 插件

Maven 有十几个预构建插件供您使用,但是有时候您只想找到自己需要的插件,构建一个定制的 Maven 插件比较容易:

  1. 用 POM packaging 创建一个新项目,设置为 “maven-plugin”。
  2. 包括一个 maven-plugin-plugin 调用,可以定义您的公布插件目标。
  3. 创建一个 Maven 插件 “mojo” 类 (一个扩展 AbstractMojo 的类)。
  4. 为类的 Javadoc 做注释来定义目标,并为每个将被作为配置参数公布的变量做注解。
  5. 实现一个 execute() 方法,该方法在调用您的插件是将被调用。

例如,清单 8 显示了一个定制插件(为了部署 Tomcat)的相关部分:

清单 8. TomcatDeployerMojo.java
package net.fpic.maven.plugins;

import java.io.File;
import java.util.StringTokenizer;

import net.fpic.tomcatservice64.TomcatDeploymentServerClient;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

import com.javasrc.server.embedded.CommandRequest;
import com.javasrc.server.embedded.CommandResponse;
import com.javasrc.server.embedded.credentials.Credentials;
import com.javasrc.server.embedded.credentials.UsernamePasswordCredentials;
import com.javasrc.util.FileUtils;

/**
 * Goal that deploys a web application to Tomcat
 *
 * @goal deploy
 * @phase install
 */
public class TomcatDeployerMojo extends AbstractMojo
{
    /**
     * The host name or IP address of the deployment server
     *
     * @parameter alias="host" expression="${deploy.host}" @required
     */
    private String serverHost;

    /**
     * The port of the deployment server
     *
     * @parameter alias="port" expression="${deploy.port}" default-value="58020"
     */
    private String serverPort;

    /**
     * The username to connect to the deployment manager (if omitted then the plugin
     * attempts to deploy the application to the server without credentials)
     *
     * @parameter alias="username" expression="${deploy.username}"
     */
    private String username;

    /**
     * The password for the specified username
     *
     * @parameter alias="password" expression="${deploy.password}"
     */
    private String password;

    /**
     * The name of the source artifact to deploy, such as target/pos.war
     *
     * @parameter alias="artifactSource" expression=${deploy.artifactSource}"
     * @required
     */
    private String artifactSource;

    /**
     * The destination name of the artifact to deploy, such as ROOT.war.
     * If not present then the
     * artifact source name is used (without pathing information)
     *
     * @parameter alias="artifactDestination"
     *   expression=${deploy.artifactDestination}"
     */
    private String artifactDestination;

    public void execute() throws MojoExecutionException
    {
        getLog().info( "Server Host: " + serverHost +
                       ", Server Port: " + serverPort +
                       ", Artifact Source: " + artifactSource +
                       ", Artifact Destination: " + artifactDestination );

        // Validate our fields
        if( serverHost == null )
        {
            throw new MojoExecutionException(
              "No deployment host specified, deployment is not possible" );
        }
        if( artifactSource == null )
        {
            throw new MojoExecutionException(
              "No source artifact is specified, deployment is not possible" );
        }

        ...
   }
}

在这个类的头部,@goal 注释指定 MOJO 执行的目标,而 @phase 指出目标执行的阶段。除了一个映射到一个有真实值的系统属性的表达式之外,每个公布的属性有一个 @phase 注释,通过将被执行的参数指定别名。如果属性有一个 @required 注释,那么它是必须的。如果它有一个default-value,那么如果没有指定的话,将使用这个值。在 execute() 方法中,您可以调用 getLog() 来访问 Maven 记录器,根据记录级别,它将输出具体消息到标准输出设备。如果插件发生故障,抛出一个 MojoExecutionException 将导致构建失败。

回页首

结束语

您可以使用 Maven 只进行构建,但是最好的 Maven 是一个项目生命周期管理工具。本文介绍了 5 个大家很少了解的特性,可以帮助您更高效地使用 Maven。在 参考资料 部分获取 Maven 的更多信息。

相关文章
  • 关于 Apache Maven 您不知道的 5 件事-转 2013-11-20

    用 Maven 管理项目文件周期的技巧 可能您对配置文件已经很熟悉了,但是您知道可以在 Maven 中使用它们来在不同的环境中执行特定行为吗?本期 5 件事 系列 文章不单介绍 Maven 的 构建特性,也介绍了管理项目生命周期的基本工具,交付了 5 个可以提高生产效率的技巧,使您在 Maven 中管理您的应用程序更为容易. 评论: Steven Haines, 创始人兼 CEO, GeekCap Inc. 2011 年 1 月 13 日 内容 关于本系列 您觉得自己懂 Java 编程?事实是,

  • 关于 Apache Maven 您不知道的 5 件事 2011-01-31

    转自:http://www.ibm.com/developerworks/cn/java/j-5things13/ Maven 是为 Java™ 开发人员提供的一个极为优秀的构建工具,您也可以使用它来管理您的项目生命周期.作为一个生命周期管理工具,Maven 是基于阶段操作的,而不像 Ant 是基于 "任务" 构建的.Maven 完成项目生命周期的所有阶段,包括验证.代码生成.编译.测试.打包.集成测试.安装.部署.以及项目网站创建和部署. 为了更好地理解 Maven 和传统构建工具的

  • 关于Gmail你可能不知道的8件事 2014-11-12

    你可能每天都在用Gmail,但可能你每天使用的只是简单的收发邮件,或者内嵌的Gtalk聊天,再或者有时使用一下搜索功能.除了可以用插件实现一些原本没有的功能外,Gmail本身也有部分功能你可能没有发掘,或很少使用,不能说是Gmail的秘密,只能说是你可能不知道的关于Gmail的8件事.这些功能有的是有趣的,有的是很有用的. 1.Https加密方式登录 没错,Gmail是支持Https方式加密浏览的,在登录时使用https://mail.google.com进行登录或在登录后手动在地址栏的http

  • 关于Java性能监控您不知道的5件事 2012-11-10

    责怪糟糕的代码(或不良代码对象)并不能帮助您发现瓶颈,提高 Java? 应用程序速度,猜测也不能帮您解决.Ted Neward 引导您关注 Java 性能监控工具,从5 个技巧开始,使用Java 5 的内置分析器JConsole 收集和分析性能数据. 当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中.跟踪 Java 应用程序瓶颈来源一直以来都是很麻烦的,因为 Java 虚拟机有黑盒效应,而且 Java 平台分析工具一贯就有缺陷. 然而,随着 Java 5 中 JConsole 的

  • 关于多线程编程您不知道的 5 件事 2014-08-05

    虽然很少有 Java™ 开发人员能够忽视多线程编程和支持它的 Java 平台库,更少有人有时间深入研究线程.相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术.以这种方式构建和运行适当的应用程序是可行的,但是您可以做的不止这些.理解 Java 编译器的线程处理特性和 JVM 将有助于您编写更高效.性能更好的 Java 代码. 在这期的 5 件事 系列 中,我将通过同步方法.volatile 变量和原子类介绍多线程编程的一些更隐晦的方面.我的讨论特别关注于这些构建如何与 JVM 和

  • 关于Google+你不得不知道的50件事 2014-02-11

    Google+项目负责人从官方角度非常详细地介绍了Google+,但旁观者清,局外人是如何看待Google+的呢?Chris Brogan分享了自己的50个看法. Google+的目的是让你离开Twitter或Facebook,或者同时离开两者,并且这事很快就会发生. 看上去像FriendFeed?担心很快会死掉?要知道Newt Gingrich已经加入G+. 有了Google+账户,Picasa用户可获得无限免费图片空间.(Flickr和Facebook图片是否感到威胁?) 有了Circles

  • 你可能不知道的100件事 2013-12-25

    以下内容均属事实,绝无杜撰,如有雷同,纯属必然. 有的可能你已经知道,有的还没有. 特别叮嘱:太高难度的请勿亲自检验. 1.没有一张纸可对折超过9次 2.根据统计每年驴子所杀的人比飞机失事所死的人还多 3.人睡觉比坐着看电视所消耗的卡路里还多 4.第一种有条形码的对象是香口胶 5.Wright"s Brother发明飞机后第一次试飞的路程比一架波音747飞机的飞机翼还短 6.1987年,美国一间航空公司将每个头等机位的飞机餐减少1粒橄榄后,节省了约35万港元 7.很多人每朝起来都喝一杯咖啡提神,

  • 关于PHP你可能不知道的10件事 2012-08-02

    1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里. 7 l6 i3 [" j6 H4 q 这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点). 2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在. 这个内置函数能够确认指定的域名能够解析成IP地址.该函数的 PHP 文档的用户评论部分有一个简单

  • 做一个优秀程序员应该知道的15件事 2013-11-30

    这篇文章主要介绍了做一个优秀程序员应该知道的15件事,写的很好,需要的朋友可以参考下 1. 懂得分享.尽可能使用开源,并且当你有能力的时候,要对其有所贡献.聚全社会之智慧,胜过某些"大"公司之短视. 2. 公平竞争.尝试其他技术.框架.方法和观点.不要总以为只有你的选择才是可行的.别的选择也有可能比你的要强得多.要以开放的心态,来检验其他人的选择. 3. 不要攻击他人.像第2条所说的,不要仅仅因为别人恰巧使用.Net.Java或PHP就去攻击他们(我在这方面有一次教训).有时,它们或许

  • 程序员需要知道的97件事,你知道几件? 2014-02-10

    有一次Kevlin Henney在检查代码中的疏漏,发现自己不知不觉地在嘀咕"该死的,这是每个程序员都需要知道的事情!"(当然了,一开始的感觉是非常强烈的),这就是Kevlin Henney发起"每个程序员都需要知道"的活动的灵感."程序员需要知道的97件事"是由众人群策群力并发布到wiki上,大家可以对其进行编辑,然后从中选取97个条目做出图书出版. 这97条每条都是对作为软件开发程序员的必修知识,就算你不是非常了解这97条里每条包含的具体知识

  • 开发第一个Android应用前你必须知道的5件事 2014-03-08

    我最近刚刚阅读了Praneeth VT发表在Reddit上的一个帖子,是关于他如何开发自己第一款Android手机应用--一个GPA计算器的.可以看出来他在这个编程世界还是新手,所以我想深入探讨一下他是如何做到的,以便于大家学习和借鉴. 在此之前,我想先介绍一下Praneeth VT. 毕业于计算机工程专业 实际上,他才总共学了为期6个月的编程课 在上了两门CS课程导论之后,他又学了Java语言 暑假期间,他决定学以致用,自己开发一个Android应用 我和Praneeth VT进行了一次关于如

  • 软件架构师应该知道的97件事 2014-06-27

    软件架构师是个让人羡慕的职业,在市场经济成熟的国家,其薪酬已经达到医生.律师.注册会计师.建筑设计师的水平.但是薪酬高低与职业成熟度没有直接的关系.重赏之下必有勇夫,高薪往往造成培养机制不健全的行业出现暂时的良莠不齐.目前我们还没有培养软件架构师的成熟机制,架构师大多是程序员自学成材.程序员擅长和电脑打交道,却不善于处理工作中的人际关系.然而经验表明,除了技术特长,沟通协作的技巧.领导协调的能力.统筹取舍的经验在指挥开发项目的过程中起着更重要的作用,而这些内容在计算机学院的课本里压根找不到.刚刚

  • 分享下网站开发人员应该知道的61件事 2014-11-13

    有人在Stack Overflow上发问,动手开发网站之前,需要知道哪些事情,这里简单为大家整理下,方便需要的朋友 不出意料地,他得到了一大堆回答. 通常情况下,你需要把所有人的发言从头到尾读一遍.但是,Stack Overflow有一个很贴心的设计,它允许在问题下方开设一个wiki区,让所有人共同编辑一个最佳答案.于是,就有了下面这篇文章,一共总结出六个方面共计61条"网站开发须知". 我发现,这种概述性的问题,最适合这种集合群智.头脑风暴式的回答方式了.这也是我第一次觉得,Stac

  • 程序员需要知道的97件事 2015-02-21

    继架构师需要知道的97件事之后,该系列来到了本期:程序员需要知道的97件事.这些内容都是通过wiki搜集的,我们欢迎大家群策群力,请说出你的想法. 在本文撰写之际,该wiki上已经有88个条目了,现摘取一些条目列举如下: Peter Sommerlad:只有代码才能做到实事求是 Uncle Bob:速度是万恶之源 Michael Feathers:API设计的黄金法则 Heinz Kabutz:掌控所用的IDE Gerard Meszaros:针对人编写测试 InfoQ有幸采访到了程序员需要知道

  • 大规模运行MongoDB应该知道的10件事 2014-06-30

    MongoDB的首席解决方案架构师Asya Kamsky最近发表了一篇文章,概括了大规模运行MongoDB需要知道的10件事. MongoDB也需要DevOps.MongoDB是一个数据库.和任何其他的数据存储一样,它也需要容量计划.调整.监控和维护.不要因为它很容易安装.入门,同时与关系型数据库相比能够更加自然地满足开发人员的范例就认为MongoDB不需要适当的照顾和喂养.开发时它能在小样本数据集上超快地运行并不意味着你就不需要良好的模式.索引策略以及产品环境所需要的正确的硬件资源了.但是如果

  • Flash开发者需要知道的10件事 2014-10-12

    此前,我们发布的新闻谈到了每个Flex开发者需要知道的10件事,本文将继续这个主题,谈谈每个Flash开发者需要知道的10件事. 近日John Lindquist谈到了在为Roundarch公司招聘Flash/Flex开发人员时的一些感受.他认为最难的地方在于问什么问题才能最好地了解到应聘者的Flash/Flex开发技能.因此,他给出了一个列表并说到:"根据我的经验,通过这个列表能更好地判断面试者的技术水平和经验". 本文就将概要地介绍Flash开发者需要知道的10件事并给出进一步阅读

  • Flex开发者需要知道的10件事 2015-02-11

    不久前,Michael Portuesi发表了一篇博文,谈到了Flex开发者需要知道的10件事.文章介绍了每个进入Flex领域的开发者都需要掌握的基本知识与技能. Michael Portuesi给出的10个条目中,有些是开发者需要了解的简单细节信息:有些则揭示了Flash/ActionScript/Flex与其他开发环境之间的差别. 如果你了解HTML/CSS并熟悉JavaScript,但却对ActionScript或Flex一无所知的话,那么应该花些时间学习一下面向对象编程,因为Action

  • 转-软件架构师应该知道的97件事 2011-08-08

    http://www.360doc.com/content/11/0508/18/5256932_115277457.shtml 架构师的行为准则(一) 最近看了一本书<软件架构师应该知道的97件事>,本来并没对它抱有太多期望和兴趣,毕竟这种讲大道理的书不可能带来什么实际收获,但看的过程中被里面中肯实在的建议给吸引,对于我这种在走向架构师这条路上常常迷失方向的人,实在是雪中送炭.读完后,决定选择其中对我有触动的条目,加上实际工作中的感悟,形成一套自认为正确的架构师行为准则,以此来矫正自己的行为

  • 有理想的程序员必须知道的15件事 2013-11-27

    作为程序员,要取得非凡成就需要记住的15件事. 1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了解自己的公司 以我在医院.咨询公司.物流企业以及大技术公司工作的经验来看,这一点所言不虚. 不同公司的运营模式差异极大.如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益! 3.与最优秀的人为伍 很早以前,我喜欢打篮球,被分配到一个水平比较

  • 每一位想有所成就的程序员都必须知道的15件事 2015-03-21

    我刚看完Chad Fowler的Passionate Programmer(中文版<我编程,我快乐:程序员职业规划之道>),这本书讲的是如何在软件开发行业中取得非凡的成就. 以下是根据这本书总结的,作为程序员,要取得非凡成就需要记住的15件事. 1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了解自己的公司 以我在医院.咨询公司.物流企业以及大技术公司工作的经验来看,这一点所言不虚. 不同公司