Our UI is in a separate module but the idea is similar:

By setting

vue.config.js:

outputDir: 'target/classes/org.apache.jena.fuseki.ui'

the Vue build goes into that location during frontend-maven-plugin which runs before the jar plugin.

jena-fuseki-webapp can unpack that in phase=generate-sources using maven-dependency-plugin.

jena-fuseki-war is only the .war generation. Maybe jena-fuseki-webapp can be slimmed down by extracting the server support functions and the UI operations as Fuseki Modules leaving the war/webapp specific start-up.

     Andy

BTW <warName> isn't the docs for maven-war-plugin but appears to work.

IIRC there is some reason not to rename the output, maybe if uploading to a managed maven repo. But if producing locally that's not important.


On 30/01/2022 08:30, Martynas Jusevičius wrote:
Not a multi-module build, but this is how we publish WAR + JAR:
https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#attachClasses

             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-war-plugin</artifactId>
                 <version>3.2.3</version>
                 <configuration>
                     <warName>ROOT</warName>
                     <webappDirectory>target/ROOT</webappDirectory>
                     <failOnMissingWebXml>true</failOnMissingWebXml>
                     <attachClasses>true</attachClasses>
                 </configuration>
             </plugin>

The dependency then looks like this (using "classes" which is the
default <attachClasses> classifier):

         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>client</artifactId>
             <version>3.1.8-SNAPSHOT</version>
             <classifier>classes</classifier>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>client</artifactId>
             <version>3.1.8-SNAPSHOT</version>
             <type>war</type>
         </dependency>

On Sat, Jan 29, 2022 at 12:01 PM Andy Seaborne <a...@apache.org> wrote:



On 28/01/2022 23:43, Bruno Kinoshita wrote:
Build passed from tag, with:


Apache Maven 3.8.2 (ea98e05a04480131370aa0c110b8c54cf726c06f)
Maven home: /opt/apache-maven-3.8.2
Java version: 11.0.13, vendor: Ubuntu, runtime:
/usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-96-generic", arch: "amd64", family: "unix"


Looked inside .jar and .tar.gz files in the dist area (binaries and
sources), and everything looks good (checked the new -ui module, didn't
find node_modules or any other unnecessary files). The jena-fuseki-ui
module creates a jar that only contains metadata. Maybe we could skip
releasing it in the future? I think as it is, it should be available in the
Maven repository as a jar dependency for users, even though it's not usable
in any way in Java I think.

We can make it a POM artifact then no jar generated.

Or.

Use the jar to deliver the UI files.

They can be served from the jar.  No files on disk. No copying from
../jena-fuseki-ui/target/dist/ during jena-fuseki-webapp.

The Jetty content-serving servlet takes URL string - and a jar is
accessed with URL <jar:file:/pathname.../!/path-in-jar/>.

The path can be determined automatically by looking up the path-in-jar
as the server starts. The files are places under "src/main/resources/"

I have, experimentally, done a Fuseki module for the UI. This is a
drop-in to FusekiMain (ditto the admin functions as a drop-in).

These will convert the standalone Fuseki server to being a Fuseki/Main +
Mod_UI + Mod_Admin, not a webapp+Jetty to run it.

Good for docker.

What I haven't looked at is how to get the WAR file setup with this
change of build. A war file unpacks its contents to disk and has jars in
WEB-INF/lib which is the webapps classpath. "Should" work if start-up
can set the location of static content.
An alternative is have a prepare step in the build to unpack the jar.

Anyone got experience of delivering JS into a WAR file in a multi-module
build?

      Andy

Reply via email to