如何向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语法定义文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。