https://issues.apache.org/jira/browse/TOMEE-1578 used a mix between your idea and mine, basically i load jaxb tree, check i need to add the Deployments then do a replace if I need to add it (avoid to break the whole formatting)
happy to get a review/test from you if possible Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber <http://www.tomitribe.com> 2015-05-05 17:05 GMT+02:00 Adam Cornett <[email protected]>: > Sorry, by original I mean the one packaged in the original tomee zip file. > > On Tue, May 5, 2015 at 11:04 AM, Adam Cornett <[email protected]> > wrote: > > > That won't work since the original file contains the tag but it is > > commented out, so a simple string matching catches the value in the > comment > > and thinks its really there, that's why I opted for the 40-ton beast of > dom > > parsing. > > > > On Tue, May 5, 2015 at 11:00 AM, Romain Manni-Bucau < > [email protected] > > > wrote: > > > >> Ah ok, thought you were using tomee:build. Yes makes sense for > tomee:run. > >> > >> About the patch we can also be brutal and use: > >> > >> String content = IO.slurp(tomeeXml); > >> if (content.contains("<Deployments")) return; // user handles it > >> content = content.replace("</tomee>", "<Deployments ...." + > >> System.lineSeparator() + "</tomee>"); > >> IO.write(tomeeXml, content); > >> > >> would work as well and be more readable. > >> > >> wdyt? > >> > >> > >> > >> > >> Romain Manni-Bucau > >> @rmannibucau <https://twitter.com/rmannibucau> | Blog > >> <http://rmannibucau.wordpress.com> | Github < > >> https://github.com/rmannibucau> | > >> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber > >> <http://www.tomitribe.com> > >> > >> 2015-05-05 16:52 GMT+02:00 Adam Cornett <[email protected]>: > >> > >> > Perhaps I have not done a good job explaining how I'm using (abusing?) > >> the > >> > tomee plugin: > >> > > >> > I have a pom only project that uses the tomee maven plugin to > generate a > >> > tomee zip, adding in the conf, replacing openjpa with hibernate adding > >> > several other libraries, adding the setenv.(bat|sh) files with the > >> correct > >> > java settings, etc. We use classifiers to create one zip per > >> environment > >> > (dev, qa, prod, etc) > >> > This zip file is attached to the project and published to our maven > >> repo. > >> > > >> > The plugin configuration is then set in our top level pom's > >> > pluginManagement and to use it in one of our projects we just have to > >> > include the groupId and artifactId. > >> > > >> > in pluginManagment: > >> > <plugin> > >> > <groupId>org.apache.openejb.maven</groupId> > >> > <artifactId>tomee-maven-plugin</artifactId> > >> > <version>${tomee.version}</version> > >> > <configuration> > >> > <tomeeGroupId>com.example</tomeeGroupId> > >> > <tomeeArtifactId>tomee</tomeeArtifactId> > >> > <tomeeClassifier>dev</tomeeClassifier> > >> > <tomeeVersion>${tomee.version}</tomeeVersion> > >> > </configuration> > >> > </plugin> > >> > > >> > in a project: > >> > > >> > <plugin> > >> > <groupId>org.apache.openejb.maven</groupId> > >> > <artifactId>tomee-maven-plugin</artifactId> > >> > </plugin> > >> > > >> > Thus each app can use mvn tomee:run for dev testing, and use use the > >> build > >> > goal to publish a tomee zip fully bundled up and ready to deploy to a > >> > server (we attach the zip to all of our EAR projects along with the > ear) > >> > > >> > This keeps the poms and source trees sane, previously we had to keep > >> > copies (using svn:externals, but still ugly) of the tomee config with > >> each > >> > ear. > >> > > >> > It also simplifies our Arquillian tests, since we are using such a > >> heavily > >> > modified version of TomEE we'd have to duplicate all of the changes in > >> the > >> > arquillian.xml, so a custom zip solves that problem too. > >> > > >> > Using a custom zip file I can keep up our internal tomee build and no > >> one > >> > else on the dev team has to worry about getting the right setup in > their > >> > checkout or pom to have it build and run correctly. > >> > > >> > > >> > The patch was attached to the original email is inline below and > >> > re-attached: > >> > > >> > diff --git > >> > > >> > a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java > >> > > >> > b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java > >> > index 6c8b412..86b13e8 100644 > >> > --- > >> > > >> > a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java > >> > +++ > >> > > >> > b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java > >> > @@ -78,6 +78,19 @@ > >> > import java.util.zip.ZipEntry; > >> > import java.util.zip.ZipFile; > >> > > >> > +import javax.xml.parsers.DocumentBuilder; > >> > +import javax.xml.parsers.DocumentBuilderFactory; > >> > +import javax.xml.transform.OutputKeys; > >> > +import javax.xml.transform.Transformer; > >> > +import javax.xml.transform.TransformerFactory; > >> > +import javax.xml.transform.dom.DOMSource; > >> > +import javax.xml.transform.stream.StreamResult; > >> > + > >> > +import org.w3c.dom.Document; > >> > +import org.w3c.dom.Element; > >> > +import org.w3c.dom.NodeList; > >> > + > >> > + > >> > import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; > >> > import static > >> > > >> > org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN; > >> > import static > >> > > >> > org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY; > >> > @@ -1330,13 +1343,28 @@ > >> > && ( > >> > (apps != null && !apps.isEmpty()) > >> > || (!"pom".equals(packaging) && > >> > !"war".equals(packaging))))) { // webapps doesn't need apps folder in > >> tomee > >> > - final FileWriter writer = new FileWriter(file); > >> > - final String rootTag = > >> container.toLowerCase(Locale.ENGLISH); > >> > - writer.write("<?xml version=\"1.0\"?>\n" + > >> > - "<" + rootTag + ">\n" + > >> > - " <Deployments dir=\"apps\" />\n" + > >> > - "</" + rootTag + ">\n"); > >> > - writer.close(); > >> > + // check to see if there is already a Deployments tag in > >> the > >> > current file > >> > + // if there isn't one, add it to the document > >> > + try{ > >> > + DocumentBuilder builder = > >> > DocumentBuilderFactory.newInstance().newDocumentBuilder(); > >> > + Document doc = builder.parse(file); > >> > + > >> > + > if(doc.getElementsByTagName("Deployments").getLength() > >> == > >> > 0){ > >> > + Element deploymentsElement = > >> > doc.createElement("Deployments"); > >> > + deploymentsElement.setAttribute("dir", "apps"); > >> > + // get the 'tomee' or 'openejb' tag and add the > >> > deployments element > >> > + > >> > > >> > doc.getElementsByTagName(container.toLowerCase(Locale.ENGLISH)).item(0).appendChild(deploymentsElement); > >> > + > >> > + // now write the new xml file > >> > + Transformer transformer = > >> > TransformerFactory.newInstance().newTransformer(); > >> > + transformer.setOutputProperty(OutputKeys.INDENT, > >> > "yes"); > >> > + DOMSource source = new DOMSource(doc); > >> > + StreamResult fileOut = new StreamResult(file); > >> > + transformer.transform(source, fileOut); > >> > + } > >> > + }catch(Exception e){ > >> > + getLog().error("Exception updating " + > file.getName(), > >> e); > >> > + } > >> > > >> > final File appsFolder = new File(catalinaBase, "apps"); > >> > if (!appsFolder.exists() && !appsFolder.mkdirs()) { > >> > > >> > > >> > > >> > > >> > > >> > > >> > On Tue, May 5, 2015 at 10:29 AM, Romain Manni-Bucau < > >> [email protected] > >> > > wrote: > >> > > >> >> 2015-05-05 16:19 GMT+02:00 Adam Cornett <[email protected]>: > >> >> > >> >> > Like I said, there are many ways to work around this issue :-) > >> >> > > >> >> > I was just offering a change to the plugin to be more selective in > >> how > >> >> it > >> >> > changes the built in file to keep our build process as simple as > >> >> possible. > >> >> > I found it odd that the plugin was careful to honor custom changes > to > >> >> the > >> >> > server.xml file and only make selected changes to it, but it will > >> >> wholesale > >> >> > replace the tomee.xml file if you use 'ear' or 'ejb' packaging. > >> When it > >> >> > does this it also wipes out the documentation comments that ship > with > >> >> the > >> >> > default file. The patch I sent keeps the original file's contents > >> and > >> >> > simply appends the deployments tag when needed if it is not already > >> >> > present, which is really the desired result of the method in > >> question. > >> >> > > >> >> > > >> >> > >> >> Well server.xml is another story. We fully control tomee.xml but not > >> >> server.xml and we try to not break tomcat update for this last one. > >> ALso > >> >> we > >> >> update this last one once we setup everything which can mean a user > can > >> >> have overriden the file which shouldn't be the case for tomee.xml. > >> >> > >> >> The easiest fix for your case is surely a flag 'dontTouchMyTomeeXml' > >> but > >> >> it > >> >> will not simplify your build. Alternative can be to support a > >> config.jar > >> >> but it is not simpler since you need to configure it again for all > >> >> distributions. > >> >> > >> >> Also what I dont get is why using tomee-maven-plugin if you start > from > >> an > >> >> existing tomee zip you provide. Doing it you loose the interest of > >> tomee > >> >> maven plugin build command which is to provide a standard layout. > >> >> > >> >> Just trying to see how to simplify the process without reimplementing > >> >> other > >> >> maven plugins > >> >> > >> >> Side note: not sure if gmail swallowed it but i didnt get any patch > >> >> > >> >> > >> >> > On Tue, May 5, 2015 at 10:07 AM, Romain Manni-Bucau < > >> >> [email protected] > >> >> > > > >> >> > wrote: > >> >> > > >> >> > > I see, why not executing maven dependency plugin before > >> >> > tomee-maven-plugin > >> >> > > and referencing the unpacked folder for the conf? > >> >> > > > >> >> > > > >> >> > > Romain Manni-Bucau > >> >> > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > >> >> > > <http://rmannibucau.wordpress.com> | Github < > >> >> > > https://github.com/rmannibucau> | > >> >> > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber > >> >> > > <http://www.tomitribe.com> > >> >> > > > >> >> > > 2015-05-05 16:01 GMT+02:00 Adam Cornett <[email protected] > >: > >> >> > > > >> >> > > > Since the conf is loaded into the zip file when we build it we > >> are > >> >> not > >> >> > > > re-supplying the conf each time we use the plugin. Since all > of > >> our > >> >> > apps > >> >> > > > use a common conf we wanted it in one place instead of having > >> copies > >> >> > > > attached to each project. > >> >> > > > > >> >> > > > On Tue, May 5, 2015 at 9:57 AM, Romain Manni-Bucau < > >> >> > > [email protected]> > >> >> > > > wrote: > >> >> > > > > >> >> > > > > Hi > >> >> > > > > > >> >> > > > > > >> >> > > > > 2015-05-05 15:47 GMT+02:00 Adam Cornett < > >> [email protected]>: > >> >> > > > > > >> >> > > > > > We use TomEE in several applications, and to speed up > builds > >> and > >> >> > > > > > standardize our deployments, we use the Maven plugin to > >> create a > >> >> > > TomEE > >> >> > > > > zip > >> >> > > > > > already configured with our libraries and configuration > files > >> >> and > >> >> > > > publish > >> >> > > > > > it to our internal maven repo. > >> >> > > > > > > >> >> > > > > > We then use the TomEE maven plugin in each project to pull > in > >> >> this > >> >> > > > custom > >> >> > > > > > build and deploy our application into it. However the > >> current > >> >> > maven > >> >> > > > > plugin > >> >> > > > > > will overwrite the conf/tomee.xml file that we have > packaged. > >> >> This > >> >> > > > > happens > >> >> > > > > > because the plugin is trying to be helpful by adding the > >> >> > > '<Deployments > >> >> > > > > > dir="apps" />' tag, which is not enabled in the file that > >> ships > >> >> > with > >> >> > > > the > >> >> > > > > > original zip, however it does this by writing out a whole > new > >> >> file > >> >> > > with > >> >> > > > > > this tag. > >> >> > > > > > > >> >> > > > > > > >> >> > > > > it does it during tomee unzip phase which is before the > >> >> > synchronization > >> >> > > > > with conf folder so your file should override the forced one. > >> >> > > > > > >> >> > > > > What do I miss? > >> >> > > > > > >> >> > > > > > >> >> > > > > > There are many ways to go about solving this issue, the > one I > >> >> came > >> >> > up > >> >> > > > > with > >> >> > > > > > is in the attached patch, developed against 2.0. This > does a > >> >> more > >> >> > > > > surgical > >> >> > > > > > update of an existing tomee.xml file without touching over > >> any > >> >> > > existing > >> >> > > > > > changes. If this needs further changes or refinement in > >> order > >> >> to > >> >> > be > >> >> > > > > > accepted into the project I'd be glad to continue to work > on > >> it > >> >> > based > >> >> > > > on > >> >> > > > > > feedback. > >> >> > > > > > > >> >> > > > > > > >> >> > > > > > - Adam Cornett > >> >> > > > > > > >> >> > > > > > > >> >> > > > > > > >> >> > > > > > > >> >> > > > > > > >> >> > > > > > >> >> > > > > >> >> > > > > >> >> > > > > >> >> > > > -- > >> >> > > > Adam Cornett > >> >> > > > [email protected] > >> >> > > > (678) 296-1150 > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > >> >> > -- > >> >> > Adam Cornett > >> >> > [email protected] > >> >> > (678) 296-1150 > >> >> > > >> >> > >> > > >> > > >> > > >> > -- > >> > Adam Cornett > >> > [email protected] > >> > (678) 296-1150 > >> > > >> > > > > > > > > -- > > Adam Cornett > > [email protected] > > (678) 296-1150 > > > > > > -- > Adam Cornett > [email protected] > (678) 296-1150 >
