MAVEN入门_如何向JAR添加资源&标准目录布局的介绍(部分翻译)

如何向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.xmlpom.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.txtLICENSE.txt等。

这个结构只有两个子目录:srctarget。这里唯一需要的其他目录是像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语法定义文件。

 

上一篇:莫名其妙的 No suitable driver found for jdbc:sqlserver://localhost:1433


下一篇:XXX.jar中没有主清单属性 问题解决