如何向JAR添加资源
原文链接:https://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR
另一个可以满足的不需要对上面的POM进行更改的常见用例是将资源打包到JAR文件中。对于这个常见的任务,Maven再次依赖于标准目录布局(Standard Directory Layout),这意味着通过使用标准的Maven约定,您可以将资源打包到JAR中,只需将这些资源放置在一个标准的目录结构中。
您可以在下面的示例中看到,我们已经添加了目录${basedir}/src/main/resources,我们将想要打包到JAR中的任何资源放在这个目录中。Maven使用的简单规则是:任何放在${basedir}/src/main/resources目录中的目录或文件都被打包到JAR中,从JAR的底部开始使用完全相同的结构。
my-app
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- resources
| `-- META-INF
| `-- application.properties
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
因此,在我们的示例中可以看到,我们在那个目录下有一个带有application.properties文件的META-INF目录。如果你打开Maven为你创建的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底部开始找到,并且我们的 application.properties 文件在 META-INF 目录中。您还会注意到其他一些文件,如 META-INF/MANIFEST.MF 以及一个 pom.xml 和 pom.properties 文件。这些都是Maven中生成JAR时的标准配置。如果您愿意,您可以创建自己的清单(manifest),但如果不这样做,Maven将默认生成一个清单。(您也可以修改默认清单中的条目。我们将在稍后讨论这个问题。)。pom.xml 和 pom.properties 文件打包在JAR中,这样Maven生成的每个工件(artifact)都是自描述的,并且还允许您在需要时在自己的应用程序中使用元数据(metadata)。一个简单的用途可能是检索应用程序的版本。操作POM文件需要使用一些Maven工具,但属性(the properties)可以使用标准的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 目录之外,您需要遵循与将资源添加到JAR相同的模式。在这一点上,你会有一个项目目录结构,看起来像下面:
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
在单元测试中,你可以使用如下简单的代码片段来访问测试所需的资源:
1 ... 2 3 // Retrieve resource 4 InputStream is = getClass().getResourceAsStream( "/test.properties" ); 5 6 // Do something with the resource 7 8 ...
标准目录布局的介绍
拥有一个通用的目录布局,可以让熟悉一个Maven项目的用户立即熟悉另一个Maven项目。 The advantages are analogous to adopting a site-wide look-and-feel.
下一节记录Maven期望的目录布局和Maven创建的目录布局。尽量遵循这个结构。但是,如果不能,这些设置可以通过项目描述符( the project descriptor)重写。
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/it | Integration Tests (primarily for plugins) |
src/assembly | Assembly descriptors |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt | Notices and attributions required by libraries that the project depends on |
README.txt | Project's readme |
在顶层,描述项目的文件:一个pom.xml文件。此外,还有一些文本文档,用户可以在收到源代码后立即阅读:README.txt、LICENSE.txt等。
这个结构只有两个子目录:src和target。这里唯一需要的其他目录是像CVS、.git或.svn这样的元数据(metadata ),以及多项目构建中的任何子项目(每个子项目都将如上所示)。
target目录用于存放构建的所有输出。
src目录包含了所有用于构建项目的源材料,它的站点等等。它包含每种类型的子目录:main用于主构建工件(the main build artifact),test用于单元测试代码和资源,site等等。
在工件产生源目录( artifact producing source directories,例如 main 和 test),一个目录用于Java语言(正常的包层次结构存在于此),另一个目录用于资源(给定默认资源定义,该结构被复制到目标类路径)。
如果对工件构建(the artifact build)有其他起作用的源,它们将在其他子目录下。例如,src/main/antlr会包含antlr语法定义文件。