- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要从命令行传递两个参数,比如 shell
和 version
。
问题是我无法理解如何在 pom.xml
中定义这两个变量,然后在运行时在我的 Java 代码中获取参数。
另外,当我将其作为 Maven 项目运行时,如何设置参数值?
任何建议都会有很大帮助。谢谢!!
最佳答案
如果您想提供 shell 和版本作为 Maven 构建的参数在编译时(当您将代码构建到一个 *.jar 文件中时),然后在某些稍后一点当您的编译代码运行时您想要检索这些参数。
这可以通过使用 maven resources plugin's filtering capability 来实现:
假设您的项目结构是
pom.xml
src/
main/
java/
Main.java
resources/
strings.properties
您可以将属性占位符放入 strings.properties 中:
shell=${my.shell}
version=${my.version}
然后在 pom.xml 中配置 maven 资源插件(将 src/main/resources/* 复制到目标目录中,jar 插件稍后将从中获取它)以在文件(称为过滤):
<project>
...
<name>bob</name>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
您可以将这些参数作为系统属性提供给 Maven(在命令行上使用 -D[name]=[value]),如下所示:
mvn clean install -Dmy.shell=X -Dmy.version=Y
然后,如果您要查看已处理的资源文件(应该在/target 中),您会看到资源插件已将文件过滤成:
shell=X
version=Y
在运行时读回它会是这样的:
public class Main {
public static void main (String[] args) {
InputStream is = Main.class.getClassLoader().getResourceAsStream("strings.properties");
Properties props = new Properties();
props.load(is);
System.out.println("shell is " + props.get("shell"));
}
}
这是假设您的代码是从生成的 jar 文件“内部”运行的。各种打包/部署形式因素可能需要稍微不同的方式来获取要读取的输入流。
在这种情况下,您不关心将这些嵌入到编译项目中的任何地方的参数存储,您只想在构建时访问它们(比如从您的单元测试代码)。
在表单中提供给 java 的任何参数(注意不允许有空格):
java <whatever> -Dprop.name=value
像这样在运行时可用:
String propValue = System.getProperty("prop.name");
这里有一点复杂,特定于 maven 和单元测试,是 maven surefire 插件(运行单元测试的插件)和 maven failsafe 插件(运行系统测试的密切相关的插件) fork off a new JVM to run your unit tests in .然而,根据他们的文档:
System property variables from the main maven process are passed to the forked process as well
所以上面的解决方案应该有效。如果没有,您可以将插件配置为不 fork 单元测试:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
或者自己将此参数传递给 fork 进程:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<systemPropertyVariables>
<my.schema>${my.schema}</my.schema>
</systemPropertyVariables>
</configuration>
</plugin>
然后它们应该可以通过 System.getProperty()
关于java - 如何在 Maven pom.xml 中定义属性并从命令行传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35216193/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!