如何往jar中添加资源文件?
另外一个常见需求就是在不修改pom文件的前提下在打包的时候把资源文件打进去。针对这个需求maven又一次基于标准目录结构,也就是说基于这个公约你可以在打包的时候很容易的打进去。
在上述例子中我们增加了${basedir}/src/main/resources目录来放置一些希望打包打进去的资源文件。maven的规则是任何在${basedir}/src/main/resources 放置的文件在打包的时候都会原封不动的安装这个目录结构打包进去如下所示:
my-app
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- resources
| `-- META-INF
| `-- application.properties
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
上面你可以看到在 META-INF 目录里有个application.properties文件,如果你解压这个jar你会看到如下目录结构:
|-- META-INF
| |-- MANIFEST.MF
| |-- application.properties
| `-- maven
| `-- com.mycompany.app
| `-- my-app
| |-- pom.properties
| `-- pom.xml
`-- com
`-- mycompany
`-- app
`-- App.class
你可以看到 ${basedir}/src/main/resources 里面的内容在jar中可以被找到在META-INF目录下。同时你也发现了META-INF/MANIFEST.MF 、 pom.xml 和pom.properties,这些文件是在maven打包的时候自动生成的。当然你也可以生成自己的manifest 文件,如果你不指定的话那么maven会生成默认的(你也可以修改manifest,后面会说到这个事)。pom.xml 和 pom.properties被maven打入jar中包括一些自身的描述信息,一些元数据信息同时也可以给你自己的三方程序使用。一个简单的需求就是查看工程版本号。操作pom文件可能需要maven的工具包,不过操作属性文件直接可以基于标准java api来操作,他的内容如下:
#Generated by Maven
#Tue Oct 04 15:43:21 GMT-05:00 2005
version=1.0-SNAPSHOT
groupId=com.mycompany.app
artifactId=my-app
单元测试的资源文件同样遵循上述标准,不过需要放在${basedir}/src/test/resources目录下。这样的话一个标准的目录结构如下所示:
my-app
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- resources
| `-- META-INF
| |-- application.properties
`-- test
|-- java
| `-- com
| `-- mycompany
| `-- app
| `-- AppTest.java
`-- resources
`-- test.properties
单元测试中你可以引用下述片段去访问测试用的资源文件:
...
// Retrieve resource
InputStream is = getClass().getResourceAsStream( "/test.properties" );
// Do something with the resource
...