构建 Maven 项目时外部化过滤器
Externalized filters when building a Maven project
我真的需要一些建议...
这是我的情况:
我有一个主要的 Maven 项目 P1,其中有几个资源可以根据目标环境进行过滤。
我想将我的过滤器文件放在另一个名为 P2 的项目中,该项目仅用于托管过滤器文件(对于这个项目和其他项目),以便独立于 P1 管理它们的配置。
第一个问题:还有其他人这样做吗?这是个好主意吗?
现在我的问题是如何使用 P2 过滤器过滤 P1 资源。在我的P1 POM中,无法使用目录“../P2”作为过滤器,因为首先我不喜欢这个,其次我使用Jenkins生成,Jenkins P1和P2不在同一个父目录。
所以我想让 P1 引用 P2 作为 jar 依赖项。但是如何定义 Maven 过滤器不是目录中的文件,而是 jar 依赖项中的资源?我为此找到的唯一方法是使用 Maven 资源插件 (https://maven.apache.org/plugins/maven-resources-plugin/examples/custom-resource-filters.html) 的 "Custom Resource Filters",其中我 link 到 P2 自定义 class 进行过滤。
此解决方案通过 Maven 为 war 代工作。但是开发人员需要使用 Maven Eclipse WTP 功能才能在他们的服务器上部署项目,并特别使用即时资源过滤(不需要 运行 Maven 构建)。 "Custom Resource Filters" 不适用于 Eclipse WTP 即时资源过滤。
所以我真的不知道该怎么办..你有什么建议吗?或者你为什么没有这个问题?
非常感谢
好吧,我最后做的是保留过滤器的 P2 项目。在我的 P2 项目中,我创建了一个 class,其灵感来自于默认的 ResourceFilter class。
package com.ads.xx.xx;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import org.apache.maven.model.Resource;
import org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.apache.maven.shared.filtering.MavenFilteringException;
import org.apache.maven.shared.filtering.MavenResourcesExecution;
import org.apache.maven.shared.filtering.MavenResourcesFiltering;
import org.apache.maven.shared.utils.PathTool;
import org.apache.maven.shared.utils.ReaderFactory;
import org.apache.maven.shared.utils.io.FileUtils;
import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
import org.apache.maven.shared.utils.io.IOUtil;
import org.codehaus.plexus.util.Scanner;
import org.sonatype.plexus.build.incremental.BuildContext;
/**
* @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering"
* role-hint="default"
*
*/
public class ResourceFilterxxxGlobal extends DefaultMavenResourcesFiltering implements MavenResourcesFiltering {
private static final String[] EMPTY_STRING_ARRAY = { };
private static final String[] DEFAULT_INCLUDES = { "**/**" };
private List<String> defaultNonFilteredFileExtensions;
/**
* @plexus.requirement
*/
public BuildContext buildContext;
/**
* @plexus.requirement role-hint="default"
*/
private MavenFileFilter mavenFileFilter;
public ResourceFilterAtamsGlobal() {
super();
}
public void filterResources(MavenResourcesExecution mavenResourcesExecution)
throws MavenFilteringException {
List<String> listeFiltres = new ArrayList<String>();
String environnement = mavenResourcesExecution.getMavenProject().getProperties().getProperty("environnement");
String fonctionnel = mavenResourcesExecution.getMavenProject().getProperties().getProperty("fonctionnel");
String application = mavenResourcesExecution.getMavenProject().getProperties().getProperty("application");
listeFiltres.add("filters/plateformes/" + environnement + "_technique.properties");
listeFiltres.add("filters/applications/" + application + "/fonctionnel/" + fonctionnel + ".properties");
listeFiltres.add("filters/applications/" + application + "/specifique/" + environnement + "_specifique.properties");
final Properties fileProps = new Properties();
DataInputStream dis = null;
try {
for (String filtrePath : listeFiltres) {
dis = new DataInputStream(getClass().getClassLoader().getResourceAsStream(filtrePath));
if (dis == null) {
System.out.println("Le fichier " + filtrePath + " n'existe pas.");
throw new MavenFilteringException("Le fichier " + filtrePath + " n'existe pas.");
}
fileProps.load(dis);
mavenResourcesExecution.getMavenProject().getProperties().putAll(fileProps);
dis.close();
}
}
catch (IOException e) {
e.printStackTrace();
throw new MavenFilteringException();
}
finally {
try {
if (dis != null) {
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
System.out.println("Le fichier de filtre n'existe pas.");
throw new MavenFilteringException("Le fichier de filtre n'existe pas.");
}
}
System.out.println("Propriétés trouvées : " + fileProps.entrySet());
mavenResourcesExecution.getMavenProject().getProperties().putAll(fileProps);
if ( mavenResourcesExecution == null )
{
throw new MavenFilteringException( "mavenResourcesExecution cannot be null" );
}
if ( mavenResourcesExecution.getResources() == null )
{
getLogger().info( "No resources configured skip copying/filtering" );
return;
}
if ( mavenResourcesExecution.getOutputDirectory() == null )
{
throw new MavenFilteringException( "outputDirectory cannot be null" );
}
if ( mavenResourcesExecution.isUseDefaultFilterWrappers() )
{
List<FileUtils.FilterWrapper> filterWrappers = new ArrayList<FileUtils.FilterWrapper>();
if ( mavenResourcesExecution.getFilterWrappers() != null )
{
filterWrappers.addAll( mavenResourcesExecution.getFilterWrappers() );
}
filterWrappers.addAll( mavenFileFilter.getDefaultFilterWrappers( mavenResourcesExecution ) );
mavenResourcesExecution.setFilterWrappers( filterWrappers );
}
if ( mavenResourcesExecution.getEncoding() == null || mavenResourcesExecution.getEncoding().length() < 1 )
{
getLogger().warn( "Using platform encoding (" + ReaderFactory.FILE_ENCODING
+ " actually) to copy filtered resources, i.e. build is platform dependent!" );
}
else
{
getLogger().info(
"Using '" + mavenResourcesExecution.getEncoding() + "' encoding to copy filtered resources." );
}
for ( Resource resource : mavenResourcesExecution.getResources() )
{
if ( getLogger().isDebugEnabled() )
{
String ls = System.getProperty( "line.separator" );
StringBuffer debugMessage =
new StringBuffer( "resource with targetPath " ).append( resource.getTargetPath() ).append( ls );
debugMessage.append( "directory " ).append( resource.getDirectory() ).append( ls );
debugMessage.append( "excludes " ).append( resource.getExcludes() == null ? " empty "
: resource.getExcludes().toString() ).append( ls );
debugMessage.append( "includes " ).append( resource.getIncludes() == null ? " empty "
: resource.getIncludes().toString() );
getLogger().debug( debugMessage.toString() );
}
String targetPath = resource.getTargetPath();
File resourceDirectory = new File( resource.getDirectory() );
if ( !resourceDirectory.isAbsolute() )
{
resourceDirectory =
new File( mavenResourcesExecution.getResourcesBaseDirectory(), resourceDirectory.getPath() );
}
if ( !resourceDirectory.exists() )
{
getLogger().info( "skip non existing resourceDirectory " + resourceDirectory.getPath() );
continue;
}
// this part is required in case the user specified "../something" as destination
// see MNG-1345
File outputDirectory = mavenResourcesExecution.getOutputDirectory();
boolean outputExists = outputDirectory.exists();
if ( !outputExists && !outputDirectory.mkdirs() )
{
throw new MavenFilteringException( "Cannot create resource output directory: " + outputDirectory );
}
boolean ignoreDelta = !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() )
|| buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) );
getLogger().debug( "ignoreDelta " + ignoreDelta );
Scanner scanner = buildContext.newScanner( resourceDirectory, ignoreDelta );
setupScanner( resource, scanner );
scanner.scan();
if ( mavenResourcesExecution.isIncludeEmptyDirs() )
{
try
{
File targetDirectory =
targetPath == null ? outputDirectory : new File( outputDirectory, targetPath );
copyDirectoryLayout( resourceDirectory, targetDirectory, scanner );
}
catch ( IOException e )
{
throw new MavenFilteringException(
"Cannot copy directory structure from " + resourceDirectory.getPath() + " to "
+ outputDirectory.getPath() );
}
}
List<String> includedFiles = Arrays.asList( scanner.getIncludedFiles() );
getLogger().info(
"Copying " + includedFiles.size() + " resource" + ( includedFiles.size() > 1 ? "s" : "" ) + (
targetPath == null ? "" : " to " + targetPath ) );
for ( String name : includedFiles )
{
File source = new File( resourceDirectory, name );
File destinationFile =
getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution );
boolean filteredExt =
filteredFileExtension( source.getName(), mavenResourcesExecution.getNonFilteredFileExtensions() );
mavenFileFilter.copyFile( source, destinationFile, resource.isFiltering() && filteredExt,
mavenResourcesExecution.getFilterWrappers(),
mavenResourcesExecution.getEncoding(),
mavenResourcesExecution.isOverwrite() );
}
// deal with deleted source files
scanner = buildContext.newDeleteScanner( resourceDirectory );
setupScanner( resource, scanner );
scanner.scan();
List<String> deletedFiles = Arrays.asList( scanner.getIncludedFiles() );
for ( String name : deletedFiles )
{
File destinationFile =
getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution );
destinationFile.delete();
buildContext.refresh( destinationFile );
}
}
}
private File getDestinationFile( File outputDirectory, String targetPath, String name, MavenResourcesExecution mavenResourcesExecution )
throws MavenFilteringException
{
String destination = name;
if ( mavenResourcesExecution.isFilterFilenames() && mavenResourcesExecution.getFilterWrappers().size() > 0 )
{
destination = filterFileName( destination, mavenResourcesExecution.getFilterWrappers() );
}
if ( targetPath != null )
{
destination = targetPath + "/" + destination;
}
File destinationFile = new File( destination );
if ( !destinationFile.isAbsolute() )
{
destinationFile = new File( outputDirectory, destination );
}
if ( !destinationFile.getParentFile().exists() )
{
destinationFile.getParentFile().mkdirs();
}
return destinationFile;
}
private String[] setupScanner( Resource resource, Scanner scanner )
{
String[] includes = null;
if ( resource.getIncludes() != null && !resource.getIncludes().isEmpty() )
{
includes = (String[]) resource.getIncludes().toArray( EMPTY_STRING_ARRAY );
}
else
{
includes = DEFAULT_INCLUDES;
}
scanner.setIncludes( includes );
String[] excludes = null;
if ( resource.getExcludes() != null && !resource.getExcludes().isEmpty() )
{
excludes = (String[]) resource.getExcludes().toArray( EMPTY_STRING_ARRAY );
scanner.setExcludes( excludes );
}
scanner.addDefaultExcludes();
return includes;
}
private void copyDirectoryLayout( File sourceDirectory, File destinationDirectory, Scanner scanner )
throws IOException
{
if ( sourceDirectory == null )
{
throw new IOException( "source directory can't be null." );
}
if ( destinationDirectory == null )
{
throw new IOException( "destination directory can't be null." );
}
if ( sourceDirectory.equals( destinationDirectory ) )
{
throw new IOException( "source and destination are the same directory." );
}
if ( !sourceDirectory.exists() )
{
throw new IOException( "Source directory doesn't exists (" + sourceDirectory.getAbsolutePath() + ")." );
}
List<String> includedDirectories = Arrays.asList( scanner.getIncludedDirectories() );
for ( String name : includedDirectories )
{
File source = new File( sourceDirectory, name );
if ( source.equals( sourceDirectory ) )
{
continue;
}
File destination = new File( destinationDirectory, name );
destination.mkdirs();
}
}
private String getRelativeOutputDirectory( MavenResourcesExecution execution )
{
String relOutDir = execution.getOutputDirectory().getAbsolutePath();
if ( execution.getMavenProject() != null && execution.getMavenProject().getBasedir() != null )
{
String basedir = execution.getMavenProject().getBasedir().getAbsolutePath();
relOutDir = PathTool.getRelativeFilePath( basedir, relOutDir );
if ( relOutDir == null )
{
relOutDir = execution.getOutputDirectory().getPath();
}
else
{
relOutDir = relOutDir.replace( '\', '/' );
}
}
return relOutDir;
}
/*
* Filter the name of a file using the same mechanism for filtering the content of the file.
*/
private String filterFileName( String name, List<FilterWrapper> wrappers )
throws MavenFilteringException
{
Reader reader = new StringReader( name );
for ( FilterWrapper wrapper : wrappers )
{
reader = wrapper.getReader( reader );
}
StringWriter writer = new StringWriter();
try
{
IOUtil.copy( reader, writer );
}
catch ( IOException e )
{
throw new MavenFilteringException( "Failed filtering filename" + name, e );
}
String filteredFilename = writer.toString();
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "renaming filename " + name + " to " + filteredFilename );
}
return filteredFilename;
}
}
然后,在P1项目中,我通过调用:
<profile>
<id>local</id>
<activation>
<file>
<exists>../Apl/pom.xml</exists>
</file>
</activation>
<build>
<filters>
<filter>../Apl/src/main/resources/filters/plateformes/${environnement}_technique.properties</filter>
<filter>../Apl/src/main/resources/filters/applications/${application}/specifique/${environnement}_specifique.properties</filter>
<filter>../Apl/src/main/resources/filters/applications/${application}/fonctionnel/${fonctionnel}.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>serveur</id>
<activation>
<file>
<missing>../Apl/pom.xml</missing>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<dependencies>
<dependency>
<groupId>com.ads.xxx</groupId>
<artifactId>apl</artifactId>
<version>1.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
Local profile是给开发者用的,而Server profile是通过Jenkins部署到远程服务器上的。效果很好。
我真的需要一些建议...
这是我的情况: 我有一个主要的 Maven 项目 P1,其中有几个资源可以根据目标环境进行过滤。
我想将我的过滤器文件放在另一个名为 P2 的项目中,该项目仅用于托管过滤器文件(对于这个项目和其他项目),以便独立于 P1 管理它们的配置。
第一个问题:还有其他人这样做吗?这是个好主意吗?
现在我的问题是如何使用 P2 过滤器过滤 P1 资源。在我的P1 POM中,无法使用目录“../P2”作为过滤器,因为首先我不喜欢这个,其次我使用Jenkins生成,Jenkins P1和P2不在同一个父目录。
所以我想让 P1 引用 P2 作为 jar 依赖项。但是如何定义 Maven 过滤器不是目录中的文件,而是 jar 依赖项中的资源?我为此找到的唯一方法是使用 Maven 资源插件 (https://maven.apache.org/plugins/maven-resources-plugin/examples/custom-resource-filters.html) 的 "Custom Resource Filters",其中我 link 到 P2 自定义 class 进行过滤。
此解决方案通过 Maven 为 war 代工作。但是开发人员需要使用 Maven Eclipse WTP 功能才能在他们的服务器上部署项目,并特别使用即时资源过滤(不需要 运行 Maven 构建)。 "Custom Resource Filters" 不适用于 Eclipse WTP 即时资源过滤。
所以我真的不知道该怎么办..你有什么建议吗?或者你为什么没有这个问题?
非常感谢
好吧,我最后做的是保留过滤器的 P2 项目。在我的 P2 项目中,我创建了一个 class,其灵感来自于默认的 ResourceFilter class。
package com.ads.xx.xx;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import org.apache.maven.model.Resource;
import org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.apache.maven.shared.filtering.MavenFilteringException;
import org.apache.maven.shared.filtering.MavenResourcesExecution;
import org.apache.maven.shared.filtering.MavenResourcesFiltering;
import org.apache.maven.shared.utils.PathTool;
import org.apache.maven.shared.utils.ReaderFactory;
import org.apache.maven.shared.utils.io.FileUtils;
import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
import org.apache.maven.shared.utils.io.IOUtil;
import org.codehaus.plexus.util.Scanner;
import org.sonatype.plexus.build.incremental.BuildContext;
/**
* @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering"
* role-hint="default"
*
*/
public class ResourceFilterxxxGlobal extends DefaultMavenResourcesFiltering implements MavenResourcesFiltering {
private static final String[] EMPTY_STRING_ARRAY = { };
private static final String[] DEFAULT_INCLUDES = { "**/**" };
private List<String> defaultNonFilteredFileExtensions;
/**
* @plexus.requirement
*/
public BuildContext buildContext;
/**
* @plexus.requirement role-hint="default"
*/
private MavenFileFilter mavenFileFilter;
public ResourceFilterAtamsGlobal() {
super();
}
public void filterResources(MavenResourcesExecution mavenResourcesExecution)
throws MavenFilteringException {
List<String> listeFiltres = new ArrayList<String>();
String environnement = mavenResourcesExecution.getMavenProject().getProperties().getProperty("environnement");
String fonctionnel = mavenResourcesExecution.getMavenProject().getProperties().getProperty("fonctionnel");
String application = mavenResourcesExecution.getMavenProject().getProperties().getProperty("application");
listeFiltres.add("filters/plateformes/" + environnement + "_technique.properties");
listeFiltres.add("filters/applications/" + application + "/fonctionnel/" + fonctionnel + ".properties");
listeFiltres.add("filters/applications/" + application + "/specifique/" + environnement + "_specifique.properties");
final Properties fileProps = new Properties();
DataInputStream dis = null;
try {
for (String filtrePath : listeFiltres) {
dis = new DataInputStream(getClass().getClassLoader().getResourceAsStream(filtrePath));
if (dis == null) {
System.out.println("Le fichier " + filtrePath + " n'existe pas.");
throw new MavenFilteringException("Le fichier " + filtrePath + " n'existe pas.");
}
fileProps.load(dis);
mavenResourcesExecution.getMavenProject().getProperties().putAll(fileProps);
dis.close();
}
}
catch (IOException e) {
e.printStackTrace();
throw new MavenFilteringException();
}
finally {
try {
if (dis != null) {
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
System.out.println("Le fichier de filtre n'existe pas.");
throw new MavenFilteringException("Le fichier de filtre n'existe pas.");
}
}
System.out.println("Propriétés trouvées : " + fileProps.entrySet());
mavenResourcesExecution.getMavenProject().getProperties().putAll(fileProps);
if ( mavenResourcesExecution == null )
{
throw new MavenFilteringException( "mavenResourcesExecution cannot be null" );
}
if ( mavenResourcesExecution.getResources() == null )
{
getLogger().info( "No resources configured skip copying/filtering" );
return;
}
if ( mavenResourcesExecution.getOutputDirectory() == null )
{
throw new MavenFilteringException( "outputDirectory cannot be null" );
}
if ( mavenResourcesExecution.isUseDefaultFilterWrappers() )
{
List<FileUtils.FilterWrapper> filterWrappers = new ArrayList<FileUtils.FilterWrapper>();
if ( mavenResourcesExecution.getFilterWrappers() != null )
{
filterWrappers.addAll( mavenResourcesExecution.getFilterWrappers() );
}
filterWrappers.addAll( mavenFileFilter.getDefaultFilterWrappers( mavenResourcesExecution ) );
mavenResourcesExecution.setFilterWrappers( filterWrappers );
}
if ( mavenResourcesExecution.getEncoding() == null || mavenResourcesExecution.getEncoding().length() < 1 )
{
getLogger().warn( "Using platform encoding (" + ReaderFactory.FILE_ENCODING
+ " actually) to copy filtered resources, i.e. build is platform dependent!" );
}
else
{
getLogger().info(
"Using '" + mavenResourcesExecution.getEncoding() + "' encoding to copy filtered resources." );
}
for ( Resource resource : mavenResourcesExecution.getResources() )
{
if ( getLogger().isDebugEnabled() )
{
String ls = System.getProperty( "line.separator" );
StringBuffer debugMessage =
new StringBuffer( "resource with targetPath " ).append( resource.getTargetPath() ).append( ls );
debugMessage.append( "directory " ).append( resource.getDirectory() ).append( ls );
debugMessage.append( "excludes " ).append( resource.getExcludes() == null ? " empty "
: resource.getExcludes().toString() ).append( ls );
debugMessage.append( "includes " ).append( resource.getIncludes() == null ? " empty "
: resource.getIncludes().toString() );
getLogger().debug( debugMessage.toString() );
}
String targetPath = resource.getTargetPath();
File resourceDirectory = new File( resource.getDirectory() );
if ( !resourceDirectory.isAbsolute() )
{
resourceDirectory =
new File( mavenResourcesExecution.getResourcesBaseDirectory(), resourceDirectory.getPath() );
}
if ( !resourceDirectory.exists() )
{
getLogger().info( "skip non existing resourceDirectory " + resourceDirectory.getPath() );
continue;
}
// this part is required in case the user specified "../something" as destination
// see MNG-1345
File outputDirectory = mavenResourcesExecution.getOutputDirectory();
boolean outputExists = outputDirectory.exists();
if ( !outputExists && !outputDirectory.mkdirs() )
{
throw new MavenFilteringException( "Cannot create resource output directory: " + outputDirectory );
}
boolean ignoreDelta = !outputExists || buildContext.hasDelta( mavenResourcesExecution.getFileFilters() )
|| buildContext.hasDelta( getRelativeOutputDirectory( mavenResourcesExecution ) );
getLogger().debug( "ignoreDelta " + ignoreDelta );
Scanner scanner = buildContext.newScanner( resourceDirectory, ignoreDelta );
setupScanner( resource, scanner );
scanner.scan();
if ( mavenResourcesExecution.isIncludeEmptyDirs() )
{
try
{
File targetDirectory =
targetPath == null ? outputDirectory : new File( outputDirectory, targetPath );
copyDirectoryLayout( resourceDirectory, targetDirectory, scanner );
}
catch ( IOException e )
{
throw new MavenFilteringException(
"Cannot copy directory structure from " + resourceDirectory.getPath() + " to "
+ outputDirectory.getPath() );
}
}
List<String> includedFiles = Arrays.asList( scanner.getIncludedFiles() );
getLogger().info(
"Copying " + includedFiles.size() + " resource" + ( includedFiles.size() > 1 ? "s" : "" ) + (
targetPath == null ? "" : " to " + targetPath ) );
for ( String name : includedFiles )
{
File source = new File( resourceDirectory, name );
File destinationFile =
getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution );
boolean filteredExt =
filteredFileExtension( source.getName(), mavenResourcesExecution.getNonFilteredFileExtensions() );
mavenFileFilter.copyFile( source, destinationFile, resource.isFiltering() && filteredExt,
mavenResourcesExecution.getFilterWrappers(),
mavenResourcesExecution.getEncoding(),
mavenResourcesExecution.isOverwrite() );
}
// deal with deleted source files
scanner = buildContext.newDeleteScanner( resourceDirectory );
setupScanner( resource, scanner );
scanner.scan();
List<String> deletedFiles = Arrays.asList( scanner.getIncludedFiles() );
for ( String name : deletedFiles )
{
File destinationFile =
getDestinationFile( outputDirectory, targetPath, name, mavenResourcesExecution );
destinationFile.delete();
buildContext.refresh( destinationFile );
}
}
}
private File getDestinationFile( File outputDirectory, String targetPath, String name, MavenResourcesExecution mavenResourcesExecution )
throws MavenFilteringException
{
String destination = name;
if ( mavenResourcesExecution.isFilterFilenames() && mavenResourcesExecution.getFilterWrappers().size() > 0 )
{
destination = filterFileName( destination, mavenResourcesExecution.getFilterWrappers() );
}
if ( targetPath != null )
{
destination = targetPath + "/" + destination;
}
File destinationFile = new File( destination );
if ( !destinationFile.isAbsolute() )
{
destinationFile = new File( outputDirectory, destination );
}
if ( !destinationFile.getParentFile().exists() )
{
destinationFile.getParentFile().mkdirs();
}
return destinationFile;
}
private String[] setupScanner( Resource resource, Scanner scanner )
{
String[] includes = null;
if ( resource.getIncludes() != null && !resource.getIncludes().isEmpty() )
{
includes = (String[]) resource.getIncludes().toArray( EMPTY_STRING_ARRAY );
}
else
{
includes = DEFAULT_INCLUDES;
}
scanner.setIncludes( includes );
String[] excludes = null;
if ( resource.getExcludes() != null && !resource.getExcludes().isEmpty() )
{
excludes = (String[]) resource.getExcludes().toArray( EMPTY_STRING_ARRAY );
scanner.setExcludes( excludes );
}
scanner.addDefaultExcludes();
return includes;
}
private void copyDirectoryLayout( File sourceDirectory, File destinationDirectory, Scanner scanner )
throws IOException
{
if ( sourceDirectory == null )
{
throw new IOException( "source directory can't be null." );
}
if ( destinationDirectory == null )
{
throw new IOException( "destination directory can't be null." );
}
if ( sourceDirectory.equals( destinationDirectory ) )
{
throw new IOException( "source and destination are the same directory." );
}
if ( !sourceDirectory.exists() )
{
throw new IOException( "Source directory doesn't exists (" + sourceDirectory.getAbsolutePath() + ")." );
}
List<String> includedDirectories = Arrays.asList( scanner.getIncludedDirectories() );
for ( String name : includedDirectories )
{
File source = new File( sourceDirectory, name );
if ( source.equals( sourceDirectory ) )
{
continue;
}
File destination = new File( destinationDirectory, name );
destination.mkdirs();
}
}
private String getRelativeOutputDirectory( MavenResourcesExecution execution )
{
String relOutDir = execution.getOutputDirectory().getAbsolutePath();
if ( execution.getMavenProject() != null && execution.getMavenProject().getBasedir() != null )
{
String basedir = execution.getMavenProject().getBasedir().getAbsolutePath();
relOutDir = PathTool.getRelativeFilePath( basedir, relOutDir );
if ( relOutDir == null )
{
relOutDir = execution.getOutputDirectory().getPath();
}
else
{
relOutDir = relOutDir.replace( '\', '/' );
}
}
return relOutDir;
}
/*
* Filter the name of a file using the same mechanism for filtering the content of the file.
*/
private String filterFileName( String name, List<FilterWrapper> wrappers )
throws MavenFilteringException
{
Reader reader = new StringReader( name );
for ( FilterWrapper wrapper : wrappers )
{
reader = wrapper.getReader( reader );
}
StringWriter writer = new StringWriter();
try
{
IOUtil.copy( reader, writer );
}
catch ( IOException e )
{
throw new MavenFilteringException( "Failed filtering filename" + name, e );
}
String filteredFilename = writer.toString();
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "renaming filename " + name + " to " + filteredFilename );
}
return filteredFilename;
}
}
然后,在P1项目中,我通过调用:
<profile>
<id>local</id>
<activation>
<file>
<exists>../Apl/pom.xml</exists>
</file>
</activation>
<build>
<filters>
<filter>../Apl/src/main/resources/filters/plateformes/${environnement}_technique.properties</filter>
<filter>../Apl/src/main/resources/filters/applications/${application}/specifique/${environnement}_specifique.properties</filter>
<filter>../Apl/src/main/resources/filters/applications/${application}/fonctionnel/${fonctionnel}.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>serveur</id>
<activation>
<file>
<missing>../Apl/pom.xml</missing>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<dependencies>
<dependency>
<groupId>com.ads.xxx</groupId>
<artifactId>apl</artifactId>
<version>1.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
Local profile是给开发者用的,而Server profile是通过Jenkins部署到远程服务器上的。效果很好。