[jira] [Commented] (JS2-1291) Improve Build to Take Advantage of Maven 3 Features

"Mansour Al Akeel (JIRA)" <[email protected]>
Newsgroups gmane.comp.jakarta.jetspeed.devel
Message-ID <JIRA.12688656.1389665015142.26110.1406080059213@arcas>
    [ https://issues.apache.org/jira/browse/JS2-1291?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14071248#comment-14071248 ] 

Mansour Al Akeel commented on JS2-1291:
---------------------------------------

The build can be simplified, if we start with the custom maven plugins. We can start cleaning them, and replace them with out-of-the-box maven plugins.
For example, looking at the generated war archetype, we have: 

      <plugin>
        <groupId>org.apache.portals.jetspeed-2</groupId>
        <artifactId>jetspeed-unpack-maven-plugin</artifactId>
        <version>${org.apache.portals.jetspeed.version}</version>
        <executions>
          <execution>
            <id>unpack-jetspeed-properties</id>
            <goals>
              <goal>unpack</goal>
            </goals>
            <phase>generate-resources</phase>
            <configuration>
              <unpack>
                <artifact>org.apache.portals.jetspeed-2:jetspeed-portal-resources:jar</artifact>
                <targetDirectory>${project.build.directory}/${project.build.finalName}</targetDirectory>
                <resources>
                  <resource>
                    <path>conf/jetspeed</path>
                    <include>jetspeed.properties</include>
                    <destination>WEB-INF/conf</destination>
                  </resource>
                </resources>
              </unpack>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.apache.portals.jetspeed-2</groupId>
            <artifactId>jetspeed-portal-resources</artifactId>
            <version>${org.apache.portals.jetspeed.version}</version>
          </dependency>
        </dependencies>
      </plugin>

This snippet  AFAIK, extracts the configuration for JS2 into the WAR. I have replaced this with a call to antrun:
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-antrun-plugin</artifactId>
				<version>1.7</version>
				<executions>
					<execution>
						<id>extract-config</id>
						<phase>process-resources</phase>
						<goals>
							<goal>run</goal>
						</goals>
						<configuration>
							<tasks>
								<property name="js2.resources.jar" value="${org.apache.portals.jetspeed-2:jetspeed-portal-resources:jar}" />
								<unzip src="${js2.resources.jar}" dest="${project.build.outputDirectory}/WEB-INF/conf">
									<patternset>
										<include name="conf/jetspeed/jetspeed.properties" />
									</patternset>
									<mapper type="flatten" />
								</unzip>
							</tasks>
						</configuration>
					</execution>
				</executions>
			</plugin>

However, honestly, I don't see why we need these configuration in a separate jar (maven artifact) in the first place. We can just put these config in the JS war, and allow others to override/delete through the overlay mechanism.

Another example is this:

      <plugin>
        <groupId>org.apache.portals.jetspeed-2</groupId>
        <artifactId>jetspeed-deploy-maven-plugin</artifactId>
        <version>${org.apache.portals.jetspeed.version}</version>
        <executions>
          <execution>
            <id>deploy-jetspeed-layouts</id>
            <goals>
              <goal>deploy</goal>
            </goals>
            <phase>process-resources</phase>
            <configuration>
              <targetBaseDir>${project.build.directory}/${project.build.finalName}</targetBaseDir>
              <destinations>
                <local>WEB-INF/deploy/local</local>
              </destinations>
              <deployments>
                <deployment>
                  <artifact>org.apache.portals.jetspeed-2:jetspeed-layouts:war</artifact>
                  <destination>local</destination>
                </deployment>
              </deployments>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.apache.portals.jetspeed-2</groupId>
            <artifactId>jetspeed-layouts</artifactId>
            <version>${org.apache.portals.jetspeed.version}</version>
            <type>war</type>
          </dependency>
        </dependencies>
      </plugin>


This custom plugin copies jetspeed-layouts to JETSPEED_WAR/WEB-INF/deploy/local. Do we need a custom maven plugin for this ?? Here's How I am doing it:
			<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-wars</id>
						<phase>process-resources</phase>
						<goals>
							<goal>copy</goal>
						</goals>
						<configuration>
							<artifactItems>
								<artifactItem>
									<groupId>org.apache.portals.jetspeed-2</groupId>
									<artifactId>j2-admin</artifactId>
									<version>${org.apache.portals.jetspeed.version}</version>
									<type>war</type>
									<outputDirectory>${project.build.outputDirectory}/WEB-INF/deploy</outputDirectory>
								</artifactItem>
								<artifactItem>
									<groupId>org.apache.portals.jetspeed-2</groupId>
									<artifactId>jetspeed-layouts</artifactId>
									<version>${org.apache.portals.jetspeed.version}</version>
									<type>war</type>
									<outputDirectory>${project.build.outputDirectory}/WEB-INF/deploy/local</outputDirectory>
								</artifactItem>
							</artifactItems>
							<stripVersion>true</stripVersion>
						</configuration>
					</execution>
				</executions>
			</plugin>
 
In fact, the way I am doing it, is copying js-admin.war to the WEB-INF/deploy directory plus the layout jar ! Without a custom maven plugin ! 

In the generated archetype for 2.3.0-SNAPSHOT we have this:

			<plugin>
				<groupId>org.apache.portals.jetspeed-2</groupId>
				<artifactId>jetspeed-fileutils-maven-plugin</artifactId>
				<version>${org.apache.portals.jetspeed.version}</version>
				<executions>
					<execution>
						<id>configure-jetspeed-properties</id>
						<goals>
							<goal>event</goal>
						</goals>
						<phase>process-resources</phase>
						<configuration>
							<srcFilePath>${project.build.directory}/${project.build.finalName}/WEB-INF/conf/jetspeed.properties</srcFilePath>
							<editPattern>^jetui.customization.method%5Cs*=.*%24</editPattern>
							use %24 for '$' and %5C for '\'
							<replacePattern>jetui.customization.method%20=%20ajax</replacePattern>
							use %20 for space
							<event>edit</event>
						</configuration>
					</execution>
				</executions>
			</plugin>

I am not sure what it does yet. However, my guess is that it replaces some values in a config file. Do we need a custom plugin to configure values in a plain text file ?? We can edit these values directly, and utilize maven war layout technique again. 

While these plug-ins wont directly simplify the over all build, however, few less things to worry about and maintain. 

With regard to using profiles, I am currently doing this to generate a folder for shared libs. It's not as clean as I want, and still to be improved significantly. For example:

		<profile>
			<id>shared-libs</id>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-dependency-plugin</artifactId>
						<version>2.8</version>
						<executions>
							<execution>
								<id>copy-dependencies</id>
								<phase>package</phase>
								<goals>
									<goal>copy</goal>
								</goals>
								<configuration>
									<artifactItems>
										<artifactItem>
											<groupId>javax.portlet</groupId>
											<artifactId>portlet-api</artifactId>
											<version>2.0</version>
										</artifactItem>

										<artifactItem>
											<groupId>javax.ccpp</groupId>
											<artifactId>ccpp</artifactId>
											<version>1.0</version>
										</artifactItem>
 .....
	</artifactItems>
									<outputDirectory>${project.build.directory}/tomcat-shared-lib</outputDirectory>
									<overWriteReleases>false</overWriteReleases>
									<overWriteSnapshots>false</overWriteSnapshots>
									<overWriteIfNewer>true</overWriteIfNewer>
								</configuration>
							</execution>
						</executions>
					</plugin>

I run this, with 
$ mvn clean package -P shared-libs

And the generated folder with the jar exist under target/tomcat-shared-libs.
I think, with todays available tools and technologies, we can ignore/drop the whole installer. With JPA we can configure it to create tables automatically, and populate them. This means we can distribute JS2 as a war file only, and allow customization through overlay. 

If we honour convention over configuration, things will start getting simpler. 



> Improve Build to Take Advantage of Maven 3 Features
> ---------------------------------------------------
>
>                 Key: JS2-1291
>                 URL: https://issues.apache.org/jira/browse/JS2-1291
>             Project: Jetspeed 2
>          Issue Type: Improvement
>          Components: Project Build
>    Affects Versions: 2.3.0
>            Reporter: David Sean Taylor
>             Fix For: 2.3.0
>
>
> This is a general effort to simplify the Jetspeed build. For example, leverage new Maven-3 features like Profiles 



--
This message was sent by Atlassian JIRA
(v6.2#6252)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.