如何打jar包
2018-01-03 11:11
369 查看
1、如何将资源文件打入jar包
另一个可以满足的常见用例是,不需要对POM进行任何更改,这是在JAR文件中打包资源。对于这个常见的任务,Maven再次依赖于标准的目录布局,这意味着通过使用标准的Maven约定,您可以将这些资源放在一个标准目录结构中,从而将资源打包到jar中。
在下面的示例中,我们添加了
在我们的示例中可以看到,有一个
如您所见,
要为您的单元测试添加资源到类路径,您可以遵循与向JAR中添加资源相同的模式,但是您将资源放置在
在单元测试中,您可以使用如下的简单代码片段来访问测试所需的资源:
上面写的粗略,详细的可以查看我在码云上所写的源码,如下:
java代码访问资源文件
2、如何过滤资源文件
有时,一个资源文件需要包含一个只能在构建时提供的值。要在Maven中完成这一操作,请使用语法
要在复制时使用Maven过滤资源,只需在您的
您会注意到,我们必须添加以前没有的
参考在
为了继续我们的示例,让我们向应用程序添加一些属性。属性文件(我们放在
这里详细的代码可以参考下面的链接:
向资源文件的属性中添加属性值
有了这些,您就可以执行下面的命令(过程资源是构建生命周期阶段,资源是被复制和过滤的):
在
要引用外部文件中定义的属性,您需要做的就是在您的pom.xml文件中添加一个指向这个外部文件的引用。首先,让我们创建我们的外部属性文件和称之为
接下来,我们将在
然后,如果我们在
详细代码可以参考下面的链接:
引用外部文件中定义的属性
接下来将会执行
详情请参考下面的链接:
在资源文件中引用pom.xml的properties属性值
过滤资源还可以从系统属性中获得值;要么是构建在Java中的系统属性(比如
现在,当您执行以下命令时(请注意定义在命令行中的
详情请参考下面的链接:
在资源文件中引入系统属性中的值
另一个可以满足的常见用例是,不需要对POM进行任何更改,这是在JAR文件中打包资源。对于这个常见的任务,Maven再次依赖于标准的目录布局,这意味着通过使用标准的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
在我们的示例中可以看到,有一个
META-INF目录和一个在其中的
application.properties文件。如果您打开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。如果您选择的话,您可以创建自己的清单,但是如果您不这样做,Maven将会默认生成一个。(您还可以修改默认清单中的条目。我们稍后会讨论这个问题。)
pom.xml和
pom.properties文件被打包在JAR中,因此Maven产生的每个工件都是自描述的,并且允许您在需要时利用您自己的应用程序中的元数据。一个简单的用途可能是检索应用程序的版本。在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
要为您的单元测试添加资源到类路径,您可以遵循与向JAR中添加资源相同的模式,但是您将资源放置在
${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 ...
上面写的粗略,详细的可以查看我在码云上所写的源码,如下:
java代码访问资源文件
2、如何过滤资源文件
有时,一个资源文件需要包含一个只能在构建时提供的值。要在Maven中完成这一操作,请使用语法
${<property name>}作用的语法对属性文件进行引用,该属性将包含该值到您的资源文件中。属性可以是您的pom.xml中定义的值之一,在用户的settings.xml,一个在外部属性文件中定义的属性,或者一个系统属性。
要在复制时使用Maven过滤资源,只需在您的
pom.xml文件中将资源目录
filtering设置为true即可:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </project>
您会注意到,我们必须添加以前没有的
build、
resources和
resource元素。此外,我们必须显式地声明资源位于
src/main/resources目录中。所有这些信息都是以前提供的默认值,但是由于默认的
filtering值是false,所以我们必须将其添加到pom.xml以覆盖默认值并将
filtering设置为true。
参考在
pom.xml中定义的属性,属性名称用于XML属性中的名字定义在值之中,使用“pom”作为项目(根)元素的别名,于是
${project.name}用来代指项目的名称,
${project.version}用来代指项目的版本,
${project.build.finalName}指在构建的项目被打包时创建的文件的最终名称,等等。请注意,POM的一些元素具有缺省值,因此不需要在
pom.xml中显式地定义。类似地,用户
settings.xml可以从“设置”开始使用属性名来引用。
为了继续我们的示例,让我们向应用程序添加一些属性。属性文件(我们放在
src/main/resources目录中),当资源被过滤时,它的值将被提供。
# application.properties application.name=${project.name} application.version=${project.version}
这里详细的代码可以参考下面的链接:
向资源文件的属性中添加属性值
有了这些,您就可以执行下面的命令(过程资源是构建生命周期阶段,资源是被复制和过滤的):
mvn process-resources
在
target/classes目录下的
application.properties文件现实的内容看起来是这样的:
# application.properties application.name=Maven Quick Start Archetype application.version=1.0-SNAPSHOT
要引用外部文件中定义的属性,您需要做的就是在您的pom.xml文件中添加一个指向这个外部文件的引用。首先,让我们创建我们的外部属性文件和称之为
src/main/filters/filter.properties:
# filter.properties my.filter.value=hello!
接下来,我们将在
pomxml文件中添加对这个新文件的引用。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <filters> <filter>src/main/filters/filter.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </project>
然后,如果我们在
application.properties文件中添加对该属性的引用:
# application.properties application.name=${project.name} application.version=${project.version}
message=${my.filter.value}
详细代码可以参考下面的链接:
引用外部文件中定义的属性
接下来将会执行
mvn process-resources命令,该命令将会把新的属性值加入到
application.properties文件中。作为定义
my.filter.value属性的另一个文件,您也可以在pom.xml的
properties部分中定义它。你将会得到相同的效果
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <properties> <my.filter.value>hello</my.filter.value> </properties> </project>
详情请参考下面的链接:
在资源文件中引用pom.xml的properties属性值
过滤资源还可以从系统属性中获得值;要么是构建在Java中的系统属性(比如
java.version或者
user.home)或属性。为了继续这个示例,让我们更改我们的应用程序。属性文件如下:
# application.properties java.version=${java.version} command.line.prop=${command.line.prop}
现在,当您执行以下命令时(请注意定义在命令行中的
command.line.prop属性),
application.properties将会包含来自系统属性中的值。
mvn process-resources "-Dcommand.line.prop=hello again"
详情请参考下面的链接:
在资源文件中引入系统属性中的值
相关文章推荐
- myeclipse10中配置如何查看jar的源码
- Eclipse中如何快速添加、删除jar包
- MyEclipse如何使用maven上传jar包到私服
- 如何读取jar包外的properties文件和log4j.properties
- 如何在改版的spring官网下载jar包问题
- 如何在Eclipse中引入Spring的jar包并挂载API帮助文档
- 如何上传jar包至Maven私服
- 如何在 WebSphere 中解决 jar 包冲突
- 如何运行jar文件
- maven 如何让所依赖的jar都被打包在一个jar里面呢
- Android Studio如何引入jar包和so库?
- 如何在eclipse中添加JAR程序包
- Android如何将程序打成jar包 ,并使用jar包
- 如何把一个基于Maven项目所有的jar文件快速列出到Excel?
- android sdk 编译--如何将源代码加入android.jar,以及make原理
- 获得maven地址,如何从中央仓库中下载jar
- rcp(插件开发)插件B需要引用插件A中的jar包-如何处理依赖关系
- SparkSQL:如何找到与Spark版本对应的jar包
- 如何添加jar包,以及如何查看jar包源代码
- 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?