Некоторые плагины позволяют использовать внешние дескрипторы (например, maven-assembly-plugin ). К сожалению, xml-maven-plugin пока не один из них.
Один из вариантов - скопировать соответствующие цели из xml-maven-plugin и включить обработку цели из maven-shared-io в цель. Я пытался сделать это сам с целью поднятия запросов к различным плагинам для использования файлов дескрипторов и подхода LocatorStrategy для поиска дескрипторов. Вот некоторая обработка, которая изменит xml-maven-plugin, чтобы позволить использовать дескрипторы. Обратите внимание, что проверка задействованных файлов незначительна, поэтому она немного хрупкая, но она работает.
1) Создайте новый проект maven-plugin (скажем, xml-ext-maven-plugin) со следующими зависимостями:
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<version>1.0-beta-2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
</dependency>
</dependencies>
2) Скопируйте файлы TransformMojo и AbstractXmlMojo .java из xml-maven-plugin (вам нужен родительский mojo для наследования свойств из его javadoc).
3) Добавить свойство дескрипторов к TransformMojo:
/**
* A list of descriptor files to obtain the transformation sets from
*
* @parameter
*/
private String[] descriptors;
4) изменить метод execute (), чтобы прочитать дескрипторы для комплектов преобразований
public void execute() throws MojoExecutionException, MojoFailureException {
//insert at start of method to resolve transformationSets fronm descriptors
if (descriptors != null && descriptors.length > 0) {
transformationSets = readDescriptors(descriptors);
}
...
5) Реализовать readDescriptors () , чтобы позволить вам находить дескрипторы в пути к классам или в проекте (обработка чтения в основном снята с DefaultAssemblyReader сборки-плагина). Обратите внимание, что в этой реализации мало проверки, правильный плагин будет проверять, установлены ли значения и т. Д.
private TransformationSet[] readDescriptors(String[] descriptors)
throws MojoExecutionException {
List descriptorSets = new ArrayList();
// add all the existing transformationSets
if (transformationSets != null && transformationSets.length != 0) {
descriptorSets.addAll(Arrays.asList(transformationSets));
}
for (int i = 0; i < descriptors.length; i++) {
getLog().info(
"Reading transformation descriptor: " + descriptors[i]);
Location location = getLocation(descriptors[i]);
Reader reader = null;
try {
reader = new InputStreamReader(location.getInputStream(),
"UTF-8");
Xpp3Dom dom = Xpp3DomBuilder.build(reader);
descriptorSets.addAll(parseTransformationSets(dom));
} catch (IOException e) {
throw new MojoExecutionException(
"Error reading transformation descriptor: "
+ descriptors[i], e);
} catch (XmlPullParserException e) {
throw new MojoExecutionException(
"Error parsing transformation descriptor: "
+ descriptors[i], e);
} finally {
IOUtil.close(reader);
}
}
return (TransformationSet[]) descriptorSets
.toArray(new TransformationSet[descriptorSets.size()]);
}
/**
* Create transformationSets from the Xpp3Dom.
* TODO use plexus utilities to resolve these elegantly?
*/
private List parseTransformationSets(Xpp3Dom dom) {
// TODO validation of the input files!
Xpp3Dom[] setDoms = dom.getChildren("transformationSet");
List sets = new ArrayList();
for (int i = 0; i < setDoms.length; i++) {
TransformationSet set = new TransformationSet();
set.setDir(new File(setDoms[i].getChild("dir").getValue()));
set.setStylesheet(new File(setDoms[i].getChild("stylesheet")
.getValue()));
Xpp3Dom outDom = setDoms[i].getChild("outputDir");
if (outDom != null) {
set.setOutputDir(new File(outDom.getValue()));
}
sets.add(set);
}
return sets;
}
6) Реализуйте getLocation () , чтобы использовать различные стратегии для обнаружения файла в виде относительного пути, URL-адреса или из пути к классам.
private Location getLocation(String path) {
List strategies = new ArrayList();
strategies.add(new RelativeFileLocatorStrategy(getBasedir()));
strategies.add(new ClasspathResourceLocatorStrategy());
strategies.add(new FileLocatorStrategy());
strategies.add(new URLLocatorStrategy());
List refStrategies = new ArrayList();
refStrategies.add(classpathStrategy);
Locator locator = new Locator();
locator.setStrategies(strategies);
Location location = locator.resolve(path);
return location;
}
7) Переопределить asAbsoluteFile () для разрешения файлов, используя стратегию локатора (позволяет также определять файлы xsl в проекте дескриптора).
protected File asAbsoluteFile(File f) {
String path = f.getPath();
// ensure we're getting a path in the form that URL can handle
if (path != null) {
path = path.replaceAll("\\\\", "/");
}
Location location = getLocation(path);
if (location == null) {
//can't find the file, let the parent implementation have a try
return super.asAbsoluteFile(f);
}
try {
return location.getFile();
} catch (IOException e) {
throw new RuntimeException("unable to read file " + f.getPath(), e);
}
}
8) Установите плагин в свой репозиторий.
9) Создайте новый проект maven для размещения ваших наборов преобразований (скажем, под названием xml-ext-test-descriptor). процесс такой же, как и для общих дескрипторов модуля Assembly-Plugin, то есть создайте проект, добавьте несколько файлов XML в папку src / main / resources и установите проект. XML-файлы имеют форму стандартной конфигурации комплектов преобразований. Например, поместите пару преобразований в src / main / resources / transfors1.xml:
<transformationSets>
<transformationSet>
<!--the config directory is in the root of the project -->
<dir>config/xsltUpdates/input</dir>
<!-- the stylesheet can be in the descriptor project-->
<stylesheet>/stylesheets/update1-8-3.xsl</stylesheet>
<outputDir>config/xsltUpdates/update1-8-3</outputDir>
</transformationSet>
<transformationSet>
<dir>config/xsltUpdates/update1-8-3</dir>
<stylesheet>/stylesheets/update1-8-9.xsl</stylesheet>
<outputDir>config/xsltUpdates/update1-8-9</outputDir>
</transformationSet>
</transformationSets>
10) Поместите ваши файлы xsl в проект дескриптора, например, SRC / главная / ресурсы / таблицы стилей / update1-8-3.xsl
11) Сконфигурируйте новый плагин в вашем проекте, чтобы ссылаться на проект дескриптора как на зависимость и ссылаться на файл xml в качестве дескриптора:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>name.seller.rich</groupId>
<artifactId>xml-ext-test-descriptor</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
<configuration>
<descriptors>
<!-- will be resolved from xml-ext-test-descriptor -->
<descriptor>/transformationSet1.xml</descriptor>
</descriptors>
</plugin>
Если все вышеперечисленные шаги сработали, при выполнении пользовательский плагин разрешит преобразование transSet1.xml и ваши файлы xsl из зависимости xml-ext-test-descriptor и обработает их как обычно.