ruby项目如何配置RVM自动切换ruby-version/gemset

RVM的wiki上有好几种指定ruby-version/gemset的方法。我推荐的是使用两个配置文件.ruby-version,.ruby-gemset分别指定ruby的版本和gemset。这种方式的优点是安全,方便,详细的解释请见参考链接。

在项目根目录下,新建下面两个文件。
.ruby-version:

1.9.3-p448 #指定项目的ruby版本

.ruby-gemset:

your_project_gemset #指定项目的gemset

配置好之后,cd到项目的根目录下,如果未安装该版本的ruby,命令行会有提示信息。如果没有指定的gemset,会新建gemset。

给不同的项目设置单独的gemset,能避免版本冲突,运行ruby命令时可以放心的省掉‘bundle exec’。

参考链接:

Maven使用体会及一些最佳实践

maven官网的介绍太简略(Run Maven),对于一些初次接触maven的用户来说,实在是让人困惑。
本文主要介绍了maven的一些常见用法,大家籍着了解一些maven的功能。

1.使用maven标准的目录结构来组织项目

maven引入了convention over configuration(约定优先配置)的原则,如果你的项目是按照maven标准的目录结构来组织,很多时候都不用写自己的配置。

2.明确指定字符编码

特别是对于需要使用非ASCII字符的开发者来说,字符编码是很严肃的一件事。
建议在你的pom.xml里添加下面的配置:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

另外,单元测试时如果不明确指定字符编码,有可能输出乱码,甚至导致测试失败,建议配置:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.7.1</version>
  <configuration>
    <argLine>-Dfile.encoding=UTF-8</argLine>
  </configuration>
</plugin>

具体解释请参考maven-surefire-plugin乱码问题

待续…

java读取classpath下资源的2种方法比较

A.使用ClassLoader.getResourceAsStream()读取资源:

@Test
public void test_ClassLoader_getResourceAsStream() {
	InputStream works = getClass().getClassLoader().getResourceAsStream(
			filename);
	assertNotNull(works);

	InputStream doesnt_work = getClass().getClassLoader()
			.getResourceAsStream("/" + filename);
	assertNull(doesnt_work);
}

B.使用spring上下文来加载资源:

@Test
public void test_ApplicationContext_getResource() {
	ApplicationContext ctx = new ClassPathXmlApplicationContext();
	// !!! dosen't work within tomcat
	Resource may_works = ctx.getResource("classpath:" + filename);
	assertTrue(may_works.exists());

	Resource always_works = ctx.getResource("classpath:/" + filename);
	assertTrue(always_works.exists());
}

下面来分析两种方法的适用情况:

方法A:
pros:不依赖额外的包,干净。
cons:资源和调用类必须由同一个(或有继承关系的)Classloader加载,否则找不到资源文件。例如在tomcat环境中,若资源文件和调用类的jar包分离,有可能出现找不到资源的情况。

方法B:
pros:只要在classpath下,就可以找到资源。
cons:需要依赖spring的包。

对于我来说,简单的应用,使用方法A就可以。
复杂些的应用,一般会使用spring,很多资源文件都使用依赖注入,使用方法B的情况很少。