You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Kyle Marek <ps...@gmail.com> on 2019/07/29 21:23:11 UTC

Custom resource filters; multiple filters

Hello Maven Users,

Some context: We are developing a webapp which utilizes React for our UI 
component. It is an known/open issue that React applications need to 
know their deployment location when built, because resource paths are 
embedded into the build output.

See: https://github.com/facebook/create-react-app/issues/2353
See: 
https://web.archive.org/web/20190729194150/https://github.com/facebook/create-react-app/issues/2353 


We've worked around the issue by setting our deployment path to some 
constant like PUBLIC_URL_REPLACE_ME and then using a Response filter to 
substitute the the value of request.getContextPath() of the relevant 
resources at run time.

We'd like to instead substitute JSP like "<%=request.getContextPath()%>" 
at build time instead of using a Response filter at run time. However, 
we also need to place a JSP page directive at the beginning of our 
resources to correct Content-Type and either disable or escape EL and 
such, so this isn't as simple as configuring React to use "@PUBLIC_URL@" 
and substituting with the built-in Maven Resources filtering.

I understand maven-resources-plugin supports the usage of one or more 
custom resource filters,

See: 
https://maven.apache.org/plugins/maven-resources-plugin/examples/custom-resource-filters.html
See: 
https://web.archive.org/web/20190729180428/https://maven.apache.org/plugins/maven-resources-plugin/examples/custom-resource-filters.html 


but it is not clear to me how this is intended to work, or if its design 
even accomplishes the developers' intent.

For example, I would expect to use the Wrapper design pattern to wrap an 
InputStream or OutputStream as it is used to copy/filter the file 
contents to the destination during copy-resources. While this design 
pattern is supported by the involved MavenFileFilter [1], there is no 
code path from a custom MavenResourcesFiltering [2] implementation to 
add a FilterWrapper to the list [3].

I would expect to use mavenResourcesExecution.addFilterWrapper() in 
filterResources() of my custom MavenResourcesFiltering implementation, 
but custom filters are executed *after* DefaultMavenResourcesFiltering [4].

While the added FilterWrapper would be available to the custom 
MavenResourcesFiltering implementations, one of the implementations 
would need to *duplicate* the logic of DefaultMavenResourcesFiltering 
and do a *second* copy of all of the resources in order to correct the 
lack of custom FilterWrappers when DefaultMavenResourcesFiltering was 
executed. I do not think this approach is sensible, or the intention of 
the custom resources filters support.

Another approach I've seen involves extending 
DefaultMavenResourcesFiltering or DefaultMavenFileFilter with another 
class that takes on the same Plexus hint="default" [5] [6], but this 
approach doesn't even utilize the custom resources filter support 
(you're basically overriding an internal Maven component when doing 
this), nor can it compound unrelated filters.

In all cases, there does not appear to be a way configure custom 
resources filters per execution or per resource directory defined in the 
POM, and information about the resource, like file name, are not passed 
to FilterWrappers (which complicates my ability to correctly set 
Content-Type in the JSP page directive).

So... are these issues just untested oversights and the existing custom 
resources filters support is useless, or am I misunderstanding how they 
are *supposed* to be utilized?

Where do we (either our project, or Maven) go from here? Should this be 
brought to Maven Developer List for collaboration on improving the design?

Thank you,

Kyle Marek


[1]:

See: 
https://maven.apache.org/shared/maven-filtering/apidocs/org/apache/maven/shared/filtering/MavenFileFilter.html#copyFile(java.io.File,%20java.io.File,%20boolean,%20java.util.List,%20java.lang.String)
See: 
https://web.archive.org/web/20190729191655/https://maven.apache.org/shared/maven-filtering/apidocs/org/apache/maven/shared/filtering/MavenFileFilter.html#copyFile(java.io.File,%20java.io.File,%20boolean,%20java.util.List,%20java.lang.String) 


[2]:

See: 
https://maven.apache.org/shared/maven-filtering/apidocs/org/apache/maven/shared/filtering/MavenResourcesFiltering.html
See: 
https://web.archive.org/web/20190729191210/https://maven.apache.org/shared/maven-filtering/apidocs/org/apache/maven/shared/filtering/MavenResourcesFiltering.html 


[3]:

See: 
https://github.com/apache/maven-filtering/blob/0f4f3eda5b59a303f9657f1e38bff8e54956d377/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java#L233-L236
See: 
https://web.archive.org/web/20190729191319/https://github.com/apache/maven-filtering/blob/0f4f3eda5b59a303f9657f1e38bff8e54956d377/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java#L233-L236 


[4]:

See: 
https://github.com/apache/maven-resources-plugin/blob/maven-resources-plugin-3.1.0/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java#L345-L347
See: 
https://web.archive.org/web/20190729191943/https://github.com/apache/maven-resources-plugin/blob/maven-resources-plugin-3.1.0/src/main/java/org/apache/maven/plugins/resources/ResourcesMojo.java#L345-L347 


[5]:

See: 
https://stackoverflow.com/questions/30798935/externalized-filters-when-building-a-maven-project/32184390#32184390
See: 
https://web.archive.org/web/20190729192250/https://stackoverflow.com/questions/30798935/externalized-filters-when-building-a-maven-project/32184390#32184390 


[6]:

See: 
https://stackoverflow.com/questions/40216611/custom-mavenresourcesfiltering-hard-to-implement/40220837#40220837
See: 
https://web.archive.org/web/20190729192054/https://stackoverflow.com/questions/40216611/custom-mavenresourcesfiltering-hard-to-implement/40220837#40220837

See: 
https://jeremylong.github.io/velocity-whitespace-resource-filter/xref/org/owasp/maven/tools/VelocityWhitespaceFilter.html
See: 
https://web.archive.org/web/20190729192136/https://jeremylong.github.io/velocity-whitespace-resource-filter/xref/org/owasp/maven/tools/VelocityWhitespaceFilter.html

See: 
https://jeremylong.github.io/velocity-whitespace-resource-filter/xref/org/owasp/maven/tools/VelocityWhitespaceFilterWrapper.html
See: 
https://web.archive.org/web/20190729192214/https://jeremylong.github.io/velocity-whitespace-resource-filter/xref/org/owasp/maven/tools/VelocityWhitespaceFilterWrapper.html

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org