Assuming you've created a Venice application composed of multiple source and resource files, how do you distribute and deploy such an application?
For a hassle-free delivery the application needs some kind of packaging.
billing
├── billing.venice
├── utils
│ ├── util.venice
│ └── render.venice
└── data
├── bill.template
└── logo.jpg
Depending on your needs there are three ways to package a Venice application:
A Venice application archive is a lightweight solution for distributing and deploying applications if the application is built from Venice source and resources files only and does not require additional 3rd party JARs.
staging
├── billing.venice
├── utils
│ ├── util.venice
│ └── render.venice
└── data
├── bill.template
└── logo.jpg
Building the application archive from a REPL:
venice> (load-module :app)
venice> (app/build
"billing"
"billing.venice"
{ "billing.venice" "staging/billing.venice"
"utils/util.venice" "staging/utils/util.venice"
"utils/render.venice" "staging/utils/render.venice"
"data/bill.template" "staging/data/bill.template"
"data/logo.jpg" "staging/data/logo.jpg" }
"./build")
This creates the application archive ./build/billing.zip
with
the main file 'billing.venice'. The main file is recorded in the
archive's MANIFEST file and automatically executed when the app is
started.
This fragment of the application archive's main file 'billing.venice' demonstrates how to load additional files and resources from the archive. The main file is bootstrapping the application.
(ns billing)
;; load util and render functions
(load-file "utils/util.venice")
(load-file "utils/render.venice")
;; load the billing template
(defn load-bill-template []
(-> (load-resource "data/bill.template")
(bytebuf-to-string :utf-8)))
;; implementation code
(println "Started app")
...
The billing application may be deployed to a file structure like
foo
├── billing.zip
└── libs
├── ...
└── venice-1.12.34.jar
It can be started from a terminal with
mars$ cd ~/foo
mars$ java -jar libs/venice-1.12.34.jar -app billing.zip
or
mars$ cd ~/foo
mars$ java -cp "libs/*" \
com.github.jlangch.venice.Launcher \
-app billing.zip
Alternatively the Venice files can be packaged to a Java resource only JAR.
staging
├── billing.venice
├── utils
│ ├── util.venice
│ └── render.venice
└── data
├── bill.template
└── logo.jpg
mars$ cd ~/staging
mars$ jar cf billing.jar utils data billing.venice
This fragment of the application's main file 'billing.venice' demonstrates how to load additional files and resources from the JAR.
(ns billing)
;; load util and render functions
(load-classpath-file "utils/util.venice")
(load-classpath-file "utils/render.venice")
;; load the billing template
(defn load-bill-template []
(-> (load-classpath-resource "data/bill.template")
(bytebuf-to-string :utf-8)))
;; implementation code
(println "Started app")
...
The billing application JAR may be deployed to a file structure like
foo
└── libs
├── billing.jar
├── venice-1.12.34.jar
└── openpdf-1.3.22.jar
It can be started from a terminal with explicitly passing the application's main file 'billing.venice'
mars$ cd ~/foo
mars$ java -cp "libs/*" \
com.github.jlangch.venice.Launcher \
-cp-file billing.venice
TODO