我希望通过将标准化密钥存储为Java类上的静态最终字符串变量来强制执行标准化密钥,并引用或静态导入它们,以将它们用作XML,字符串,方法,注释等中的值。 / p>
有没有人知道让Maven像StringKeys.SOME_KEY这样的值插入(如过滤)值到XML文件中的好方法?例如
之类的东西<element value="${StringKeys.SOME_KEY}"/>
或类似 - 主要思想是强制执行共性并防止密钥错位。或者是另一种完成相同的解决方案 - 有一些语义,如果引用了一个不存在的String,那么它在构建期间会失败吗?奖励积分如果它也适用于C#。
答案 0 :(得分:2)
您可以使用XSLT并使用EL表达式来扩展字符串。
答案 1 :(得分:1)
有时使用字符串常量比它的价值更麻烦。和IMO,这是一个这样的例子。
但如果你想追求这个,这里有一些可能适合你的想法:
使用Java DOM库在内存中使用Java常量构建XML。
将常量放入Properties对象,然后使用Velocity,Freemarker或等效的Java兼容模板语言创建XML文件模板,该语言将属性值扩展为XML。
2a上。在某些情况下,可以使用JSP而不是通用的Java兼容模板语言。
使用命名常量的占位符生成XML,然后使用XSLT将占位符替换为实际值。
但是在每种情况下,为了使用命名常量而采取的步骤会导致其他区域的脆弱性,更不用说更多的代码和额外的处理。这让我回到原点......
编辑我认为没有真正妥善解决这个问题的真正原因是这是一个非常难的问题。
为了说明,使用JSP生成XML(和规则)将确保您只使用有效的Java常量,并且对于生成的Java类而言是快速失败的。但是,JSP方法并不能保证您生成格式良好的XML。
问题的根源在于,您需要在XML模板中嵌入Java构造的表现力,并结合静态检查模板的Java和XML方面的良好形式。你真的需要适当的语言支持,但实际上可用的解决方案只输出字符而不考虑(在这种情况下)XML语法规则。
答案 2 :(得分:1)
你不能使用字符串的XML枚举限制吗?
<xsd:restriction base = "xsd:string">
<xsd:enumeration value = "AUD"/><!-- Australian Dollar -->
<xsd:enumeration value = "BRL"/><!-- Brazilian Real -->
<xsd:enumeration value = "CAD"/><!-- Canadian Dollar -->
</xsd:restriction>
答案 3 :(得分:1)
您可以使用Xslt生成您的POM,可能需要参考,您可以使用下面的
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:masterrule="com.Xxxxxx.ClassName" exclude-result-prefixes="masterrule #default">
<xsl:value-of select="masterrule:xxxxx"/>
答案 4 :(得分:0)
速度或类似是你最好的选择,但它需要编写你自己的插件。
我通常会在另一个方向执行此操作 - 将键和值存储在属性文件中,并将其过滤为XML并将其读入Java / C#类。您可以在我们的书籍http://brettporter.wordpress.com/2009/09/30/apache-maven-2-effective-implementation-sample-chapter/
的免费样本章节中找到一个示例