From 23500769f3079c16762fe2ed3dba7268deafbf57 Mon Sep 17 00:00:00 2001 From: runner Date: Mon, 25 Sep 2023 02:05:49 +0000 Subject: [PATCH] Generated by gradle-git-publish. --- releases/3.0.0/asciidoc/asciidoctor.css | 426 +++++ .../3.0.0/asciidoc/coderay-asciidoctor.css | 87 + releases/3.0.0/asciidoc/index.html | 1450 +++++++++++++++++ releases/3.0.0/asciidoctor.css | 426 +++++ releases/3.0.0/coderay-asciidoctor.css | 87 + releases/3.0.0/index.html | 1450 +++++++++++++++++ 6 files changed, 3926 insertions(+) create mode 100644 releases/3.0.0/asciidoc/asciidoctor.css create mode 100644 releases/3.0.0/asciidoc/coderay-asciidoctor.css create mode 100644 releases/3.0.0/asciidoc/index.html create mode 100644 releases/3.0.0/asciidoctor.css create mode 100644 releases/3.0.0/coderay-asciidoctor.css create mode 100644 releases/3.0.0/index.html diff --git a/releases/3.0.0/asciidoc/asciidoctor.css b/releases/3.0.0/asciidoc/asciidoctor.css new file mode 100644 index 00000000..9d9cc70c --- /dev/null +++ b/releases/3.0.0/asciidoc/asciidoctor.css @@ -0,0 +1,426 @@ +/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment @import statement to use as custom stylesheet */ +/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ +article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} +audio,video{display:inline-block} +audio:not([controls]){display:none;height:0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} +a{background:none} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1{font-size:2em;margin:.67em 0} +abbr[title]{border-bottom:1px dotted} +b,strong{font-weight:bold} +dfn{font-style:italic} +hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:monospace;font-size:1em} +pre{white-space:pre-wrap} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-.5em} +sub{bottom:-.25em} +img{border:0} +svg:not(:root){overflow:hidden} +figure{margin:0} +fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,select{text-transform:none} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} +button[disabled],html input[disabled]{cursor:default} +input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} +html,body{font-size:100%} +body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} +a:hover{cursor:pointer} +img,object,embed{max-width:100%;height:auto} +object,embed{height:100%} +img{-ms-interpolation-mode:bicubic} +.left{float:left!important} +.right{float:right!important} +.text-left{text-align:left!important} +.text-right{text-align:right!important} +.text-center{text-align:center!important} +.text-justify{text-align:justify!important} +.hide{display:none} +img,object,svg{display:inline-block;vertical-align:middle} +textarea{height:auto;min-height:50px} +select{width:100%} +.center{margin-left:auto;margin-right:auto} +.stretch{width:100%} +.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} +div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} +a{color:#2156a5;text-decoration:underline;line-height:inherit} +a:hover,a:focus{color:#1d4b8f} +a img{border:0} +p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} +p aside{font-size:.875em;line-height:1.35;font-style:italic} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} +h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} +h1{font-size:2.125em} +h2{font-size:1.6875em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} +h4,h5{font-size:1.125em} +h6{font-size:1em} +hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} +em,i{font-style:italic;line-height:inherit} +strong,b{font-weight:bold;line-height:inherit} +small{font-size:60%;line-height:inherit} +code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} +ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} +ul,ol{margin-left:1.5em} +ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} +ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} +ul.square{list-style-type:square} +ul.circle{list-style-type:circle} +ul.disc{list-style-type:disc} +ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} +dl dt{margin-bottom:.3125em;font-weight:bold} +dl dd{margin-bottom:1.25em} +abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} +abbr{text-transform:none} +blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} +blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} +blockquote cite::before{content:"\2014 \0020"} +blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} +blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} +@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} +h1{font-size:2.75em} +h2{font-size:2.3125em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} +h4{font-size:1.4375em}} +table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} +table thead,table tfoot{background:#f7f8f7} +table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} +table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} +table tr.even,table tr.alt{background:#f8f8f7} +table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} +h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} +.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} +.clearfix::after,.float-group::after{clear:both} +:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} +:not(pre)>code.nobreak{word-wrap:normal} +:not(pre)>code.nowrap{white-space:nowrap} +pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} +pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} +pre>code{display:block} +pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} +em em{font-style:normal} +strong strong{font-weight:400} +.keyseq{color:rgba(51,51,51,.8)} +kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} +.keyseq kbd:first-child{margin-left:0} +.keyseq kbd:last-child{margin-right:0} +.menuseq,.menuref{color:#000} +.menuseq b:not(.caret),.menuref{font-weight:inherit} +.menuseq{word-spacing:-.02em} +.menuseq b.caret{font-size:1.25em;line-height:.8} +.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} +b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} +b.button::before{content:"[";padding:0 3px 0 2px} +b.button::after{content:"]";padding:0 2px 0 3px} +p a>code:hover{color:rgba(0,0,0,.9)} +#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} +#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} +#header::after,#content::after,#footnotes::after,#footer::after{clear:both} +#content{margin-top:1.25em} +#content::before{content:none} +#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} +#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} +#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} +#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} +#header .details span:first-child{margin-left:-.125em} +#header .details span.email a{color:rgba(0,0,0,.85)} +#header .details br{display:none} +#header .details br+span::before{content:"\00a0\2013\00a0"} +#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} +#header .details br+span#revremark::before{content:"\00a0|\00a0"} +#header #revnumber{text-transform:capitalize} +#header #revnumber::after{content:"\00a0"} +#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} +#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} +#toc>ul{margin-left:.125em} +#toc ul.sectlevel0>li>a{font-style:italic} +#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} +#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} +#toc li{line-height:1.3334;margin-top:.3334em} +#toc a{text-decoration:none} +#toc a:active{text-decoration:underline} +#toctitle{color:#7a2518;font-size:1.2em} +@media screen and (min-width:768px){#toctitle{font-size:1.375em} +body.toc2{padding-left:15em;padding-right:0} +#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} +#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} +#toc.toc2>ul{font-size:.9em;margin-bottom:0} +#toc.toc2 ul ul{margin-left:0;padding-left:1em} +#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} +body.toc2.toc-right{padding-left:0;padding-right:15em} +body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} +@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} +#toc.toc2{width:20em} +#toc.toc2 #toctitle{font-size:1.375em} +#toc.toc2>ul{font-size:.95em} +#toc.toc2 ul ul{padding-left:1.25em} +body.toc2.toc-right{padding-left:0;padding-right:20em}} +#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} +#content #toc>:first-child{margin-top:0} +#content #toc>:last-child{margin-bottom:0} +#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} +#footer-text{color:rgba(255,255,255,.8);line-height:1.44} +#content{margin-bottom:.625em} +.sect1{padding-bottom:.625em} +@media screen and (min-width:768px){#content{margin-bottom:1.25em} +.sect1{padding-bottom:1.25em}} +.sect1:last-child{padding-bottom:0} +.sect1+.sect1{border-top:1px solid #e7e7e9} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} +#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} +#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} +#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} +details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} +details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} +.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} +table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} +.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} +table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} +.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} +.admonitionblock>table td.icon{text-align:center;width:80px} +.admonitionblock>table td.icon img{max-width:none} +.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} +.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} +.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} +.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} +.exampleblock>.content>:first-child{margin-top:0} +.exampleblock>.content>:last-child{margin-bottom:0} +.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} +.sidebarblock>:first-child{margin-top:0} +.sidebarblock>:last-child{margin-bottom:0} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} +.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} +@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} +@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} +.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} +.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} +.listingblock>.content{position:relative} +.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} +.listingblock:hover code[data-lang]::before{display:block} +.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} +.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} +.listingblock pre.highlightjs{padding:0} +.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} +.listingblock pre.prettyprint{border-width:0} +.prettyprint{background:#f7f7f8} +pre.prettyprint .linenums{line-height:1.45;margin-left:2em} +pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} +pre.prettyprint li code[data-lang]::before{opacity:1} +pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} +table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} +table.linenotable td.code{padding-left:.75em} +table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} +pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} +pre.pygments .lineno::before{content:"";margin-right:-.125em} +.quoteblock{margin:0 1em 1.25em 1.5em;display:table} +.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} +.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} +.quoteblock blockquote{margin:0;padding:0;border:0} +.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} +.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} +.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} +.verseblock{margin:0 1em 1.25em} +.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} +.verseblock pre strong{font-weight:400} +.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} +.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} +.quoteblock .attribution br,.verseblock .attribution br{display:none} +.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} +.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} +.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} +.quoteblock.abstract{margin:0 1em 1.25em;display:block} +.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} +.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} +.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} +.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} +.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} +table.tableblock{max-width:100%;border-collapse:separate} +p.tableblock:last-child{margin-bottom:0} +td.tableblock>.content>:last-child{margin-bottom:-1.25em} +td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0} +table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} +table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} +table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} +table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} +table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} +table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} +table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} +table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} +table.frame-all{border-width:1px} +table.frame-sides{border-width:0 1px} +table.frame-topbot,table.frame-ends{border-width:1px 0} +table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} +th.halign-left,td.halign-left{text-align:left} +th.halign-right,td.halign-right{text-align:right} +th.halign-center,td.halign-center{text-align:center} +th.valign-top,td.valign-top{vertical-align:top} +th.valign-bottom,td.valign-bottom{vertical-align:bottom} +th.valign-middle,td.valign-middle{vertical-align:middle} +table thead th,table tfoot th{font-weight:bold} +tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} +tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} +p.tableblock>code:only-child{background:none;padding:0} +p.tableblock{font-size:1em} +ol{margin-left:1.75em} +ul li ol{margin-left:1.5em} +dl dd{margin-left:1.125em} +dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} +ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} +ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} +ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} +ul.unstyled,ol.unstyled{margin-left:0} +ul.checklist{margin-left:.625em} +ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} +ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} +ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} +ul.inline>li{margin-left:1.25em} +.unstyled dl dt{font-weight:400;font-style:normal} +ol.arabic{list-style-type:decimal} +ol.decimal{list-style-type:decimal-leading-zero} +ol.loweralpha{list-style-type:lower-alpha} +ol.upperalpha{list-style-type:upper-alpha} +ol.lowerroman{list-style-type:lower-roman} +ol.upperroman{list-style-type:upper-roman} +ol.lowergreek{list-style-type:lower-greek} +.hdlist>table,.colist>table{border:0;background:none} +.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} +td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} +td.hdlist1{font-weight:bold;padding-bottom:1.25em} +.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} +.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} +.colist td:not([class]):first-child img{max-width:none} +.colist td:not([class]):last-child{padding:.25em 0} +.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} +.imageblock.left{margin:.25em .625em 1.25em 0} +.imageblock.right{margin:.25em 0 1.25em .625em} +.imageblock>.title{margin-bottom:0} +.imageblock.thumb,.imageblock.th{border-width:6px} +.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} +.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} +.image.left{margin-right:.625em} +.image.right{margin-left:.625em} +a.image{text-decoration:none;display:inline-block} +a.image object{pointer-events:none} +sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} +sup.footnote a,sup.footnoteref a{text-decoration:none} +sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} +#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} +#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} +#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} +#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} +#footnotes .footnote:last-of-type{margin-bottom:0} +#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} +.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} +.gist .file-data>table td.line-data{width:99%} +div.unbreakable{page-break-inside:avoid} +.big{font-size:larger} +.small{font-size:smaller} +.underline{text-decoration:underline} +.overline{text-decoration:overline} +.line-through{text-decoration:line-through} +.aqua{color:#00bfbf} +.aqua-background{background:#00fafa} +.black{color:#000} +.black-background{background:#000} +.blue{color:#0000bf} +.blue-background{background:#0000fa} +.fuchsia{color:#bf00bf} +.fuchsia-background{background:#fa00fa} +.gray{color:#606060} +.gray-background{background:#7d7d7d} +.green{color:#006000} +.green-background{background:#007d00} +.lime{color:#00bf00} +.lime-background{background:#00fa00} +.maroon{color:#600000} +.maroon-background{background:#7d0000} +.navy{color:#000060} +.navy-background{background:#00007d} +.olive{color:#606000} +.olive-background{background:#7d7d00} +.purple{color:#600060} +.purple-background{background:#7d007d} +.red{color:#bf0000} +.red-background{background:#fa0000} +.silver{color:#909090} +.silver-background{background:#bcbcbc} +.teal{color:#006060} +.teal-background{background:#007d7d} +.white{color:#bfbfbf} +.white-background{background:#fafafa} +.yellow{color:#bfbf00} +.yellow-background{background:#fafa00} +span.icon>.fa{cursor:default} +a span.icon>.fa{cursor:inherit} +.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} +.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} +.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} +.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} +.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} +.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} +.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} +.conum[data-value] *{color:#fff!important} +.conum[data-value]+b{display:none} +.conum[data-value]::after{content:attr(data-value)} +pre .conum[data-value]{position:relative;top:-.125em} +b.conum *{color:inherit!important} +.conum:not([data-value]):empty{display:none} +dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} +h1,h2,p,td.content,span.alt{letter-spacing:-.01em} +p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} +p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} +p{margin-bottom:1.25rem} +.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} +.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} +.print-only{display:none!important} +@page{margin:1.25cm .75cm} +@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} +html{font-size:80%} +a{color:inherit!important;text-decoration:underline!important} +a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} +a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} +abbr[title]::after{content:" (" attr(title) ")"} +pre,blockquote,tr,img,object,svg{page-break-inside:avoid} +thead{display:table-header-group} +svg{max-width:100%} +p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} +h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} +#toc,.sidebarblock,.exampleblock>.content{background:none!important} +#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} +body.book #header{text-align:center} +body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} +body.book #header .details{border:0!important;display:block;padding:0!important} +body.book #header .details span:first-child{margin-left:0!important} +body.book #header .details br{display:block} +body.book #header .details br+span::before{content:none!important} +body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} +body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} +.listingblock code[data-lang]::before{display:block} +#footer{padding:0 .9375em} +.hide-on-print{display:none!important} +.print-only{display:block!important} +.hide-for-print{display:none!important} +.show-for-print{display:inherit!important}} +@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} +.sect1{padding:0!important} +.sect1+.sect1{border:0} +#footer{background:none} +#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} +@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} \ No newline at end of file diff --git a/releases/3.0.0/asciidoc/coderay-asciidoctor.css b/releases/3.0.0/asciidoc/coderay-asciidoctor.css new file mode 100644 index 00000000..d01b0a80 --- /dev/null +++ b/releases/3.0.0/asciidoc/coderay-asciidoctor.css @@ -0,0 +1,87 @@ +/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */ +pre.CodeRay{background:#f7f7f8} +.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0} +.CodeRay span.line-numbers{display:inline-block;margin-right:.75em} +.CodeRay .line-numbers strong{color:#000} +table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.CodeRay td{vertical-align:top;line-height:inherit} +table.CodeRay td.line-numbers{text-align:right} +table.CodeRay td.code{padding:0 0 0 .75em} +.CodeRay .debug{color:#fff !important;background:#000080 !important} +.CodeRay .annotation{color:#007} +.CodeRay .attribute-name{color:#000080} +.CodeRay .attribute-value{color:#700} +.CodeRay .binary{color:#509} +.CodeRay .comment{color:#998;font-style:italic} +.CodeRay .char{color:#04d} +.CodeRay .char .content{color:#04d} +.CodeRay .char .delimiter{color:#039} +.CodeRay .class{color:#458;font-weight:bold} +.CodeRay .complex{color:#a08} +.CodeRay .constant,.CodeRay .predefined-constant{color:#008080} +.CodeRay .color{color:#099} +.CodeRay .class-variable{color:#369} +.CodeRay .decorator{color:#b0b} +.CodeRay .definition{color:#099} +.CodeRay .delimiter{color:#000} +.CodeRay .doc{color:#970} +.CodeRay .doctype{color:#34b} +.CodeRay .doc-string{color:#d42} +.CodeRay .escape{color:#666} +.CodeRay .entity{color:#800} +.CodeRay .error{color:#808} +.CodeRay .exception{color:inherit} +.CodeRay .filename{color:#099} +.CodeRay .function{color:#900;font-weight:bold} +.CodeRay .global-variable{color:#008080} +.CodeRay .hex{color:#058} +.CodeRay .integer,.CodeRay .float{color:#099} +.CodeRay .include{color:#555} +.CodeRay .inline{color:#000} +.CodeRay .inline .inline{background:#ccc} +.CodeRay .inline .inline .inline{background:#bbb} +.CodeRay .inline .inline-delimiter{color:#d14} +.CodeRay .inline-delimiter{color:#d14} +.CodeRay .important{color:#555;font-weight:bold} +.CodeRay .interpreted{color:#b2b} +.CodeRay .instance-variable{color:#008080} +.CodeRay .label{color:#970} +.CodeRay .local-variable{color:#963} +.CodeRay .octal{color:#40e} +.CodeRay .predefined{color:#369} +.CodeRay .preprocessor{color:#579} +.CodeRay .pseudo-class{color:#555} +.CodeRay .directive{font-weight:bold} +.CodeRay .type{font-weight:bold} +.CodeRay .predefined-type{color:inherit} +.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold} +.CodeRay .key{color:#808} +.CodeRay .key .delimiter{color:#606} +.CodeRay .key .char{color:#80f} +.CodeRay .value{color:#088} +.CodeRay .regexp .delimiter{color:#808} +.CodeRay .regexp .content{color:#808} +.CodeRay .regexp .modifier{color:#808} +.CodeRay .regexp .char{color:#d14} +.CodeRay .regexp .function{color:#404;font-weight:bold} +.CodeRay .string{color:#d20} +.CodeRay .string .string .string{background:#ffd0d0} +.CodeRay .string .content{color:#d14} +.CodeRay .string .char{color:#d14} +.CodeRay .string .delimiter{color:#d14} +.CodeRay .shell{color:#d14} +.CodeRay .shell .delimiter{color:#d14} +.CodeRay .symbol{color:#990073} +.CodeRay .symbol .content{color:#a60} +.CodeRay .symbol .delimiter{color:#630} +.CodeRay .tag{color:#008080} +.CodeRay .tag-special{color:#d70} +.CodeRay .variable{color:#036} +.CodeRay .insert{background:#afa} +.CodeRay .delete{background:#faa} +.CodeRay .change{color:#aaf;background:#007} +.CodeRay .head{color:#f8f;background:#505} +.CodeRay .insert .insert{color:#080} +.CodeRay .delete .delete{color:#800} +.CodeRay .change .change{color:#66f} +.CodeRay .head .head{color:#f4f} \ No newline at end of file diff --git a/releases/3.0.0/asciidoc/index.html b/releases/3.0.0/asciidoc/index.html new file mode 100644 index 00000000..628ee7d8 --- /dev/null +++ b/releases/3.0.0/asciidoc/index.html @@ -0,0 +1,1450 @@ + + + + + + + + +The Badass JLink Plugin + + + + + + + + + + +
+
+

Introduction

+
+
+

The badass-jlink plugin allows you to create custom runtime images for modular applications with minimal effort. +It also lets you create an application installer with the jpackage tool.

+
+
+ + + + + +
+ + +For non-modular applications use the Badass-Runtime plugin. +
+
+
+

Many modular applications have one or more non-modular dependencies, which are treated as automatic modules by the Java platform. +However, jlink cannot work with automatic modules. +The typical way to solve this problem is to convert the non-modular jars to explicit modules, by adding an appropriate module descriptor to each non-modular jar. +This is a tedious process if your application has lots of non-modular dependencies.

+
+
+

The badass-jlink plugin takes a more pragmatic approach by combining all non-modular dependencies into a single jar. +This way, only the resulting merged module needs a module descriptor.

+
+
+

The plugin provides several tasks. The most frequently used are jlink, which creates a custom runtime image in a given directory, +and jlinkZip, which in addition creates a zip archive of the custom runtime image. +With the jpackage task you can create a platform-specific installer for your application.

+
+
+ + + + + +
+ + +The current version of this plugin requires Java 17 and Gradle 7.4 or newer. +While it might work with some combinations of older Java and Gradle versions, these are not officially supported. +If you are forced to work with an older Gradle release, you should use the version 2.25.0 of this plugin. +
+
+
+

To use the plugin, include the following in your build script:

+
+
+
+
plugins {
+    id 'org.beryx.jlink' version '3.0.0'
+}
+
+
+
+

Applying the Badass-JLink plugin also implicitly applies the Application plugin.

+
+
+

The plugin uses an extension named jlink. +The sample below shows a few configuration options.

+
+
+
+
jlink {
+    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
+    launcher{
+        name = 'hello'
+        jvmArgs = ['-Dlog4j.configurationFile=./log4j2.xml']
+    }
+}
+
+
+
+

The next sections provide detailed information on how to configure the plugin.

+
+
+ + + + + +
+ + +The source code is available on GitHub and is licensed under the Apache-2.0 license. +
+
+
+
+
+

User Guide

+
+
+

Creating a custom runtime image can be a challenging task if your application has many non-modular dependencies. +To let you address all possible issues, badass-jlink allows you to configure the jlink extension using various properties, methods and script blocks.

+
+
+

The operations required to create a custom runtime image are grouped in several tasks. +This gives you the possibility to tweak a particular step by hooking into the corresponding task +(via doFirst, doLast, TaskExecutionListener or TaskActionListener).

+
+
+

Tasks

+
+
+
prepareMergedJarsDir
+
+

Unpacks all non-modular dependencies in a designated directory.
+depends on: jar

+
+
createMergedModule
+
+

Creates the merged module using the content of the directory prepared by the previous task and adding a module descriptor to it.
+depends on: prepareMergedJarsDir

+
+
createDelegatingModules
+
+

For each non-modular dependency, it creates a delegating module, which is an open module +consisting only of a module descriptor. The module descriptor specifies that the delegating module requires transitive the merged module.
+ depends on: createMergedModule

+
+
prepareModulesDir
+
+

Copies all modules needed by jlink to a designated directory.
+depends on: createDelegatingModules

+
+
jlink
+
+

Uses the jlink tool to create the custom runtime image.
+depends on: prepareModulesDir

+
+
jlinkZip
+
+

Creates a zip archive of the custom runtime image.
+depends on: jlink

+
+
suggestMergedModuleInfo
+
+

Displays the mergedModule block that will be used if your jlink extension doesn’t include one. +You can use the suggested block as a starting point for your custom mergedModule block.
+ depends on: prepareMergedJarsDir

+
+
jpackageImage
+
+

Uses the jpackage tool to create a platform-specific application image.
+depends on: prepareModulesDir

+
+
jpackage
+
+

Uses the jpackage tool to create a platform-specific application installer.
+depends on: jpackageImage

+
+
+
+
+

A detailed description of these tasks is given in Task details

+
+
+
+

Properties

+
+
+
imageDir
+
+

The directory into which the custom runtime image should be generated.
+(If you use the targetPlatform method to generate images for other platforms, the corresponding images will be created in subdirectories of imageDir.)
+ defaultValue: buildDir/image
+ usage example: imageDir = file("$buildDir/myapp-image")

+
+
imageZip
+
+

The file into which a zip archive of the custom runtime image should be created.
+defaultValue: buildDir/image.zip
+usage example: imageZip = file("$buildDir/myapp-image.zip")

+
+
imageName
+
+

Convenience property for setting the values of both imageDir and imageZip as follows:
+    imageDir ← buildDir/imageName
+    imageZip ← buildDir/imageName.zip
+usage example: imageName = 'hello'

+
+
jlinkBasePath
+
+

The path to the base directory that will be used by the plugin to store intermediate outputs.
+defaultValue: buildDir/jlinkbase
+usage example: jlinkBasePath = "$buildDir/my-jlinkbase"

+
+
mainClass
+
+

The main class to be provided as part of the --launcher option of jlink.
+defaultValue: application.mainClass (from the Application plugin)
+usage example: mainClass = 'org.example.MyApp'

+
+
moduleName
+
+

The module name of this application.
+defaultValue: the module name specified in this application’s module-info.java
+usage example: moduleName = 'org.example.myapp'

+
+
mergedModuleName
+
+

The name of the merged module.
+defaultValue: moduleName.merged.module
+usage example: mergedModuleName = 'org.example.myapp.merged.module'

+
+
mergedModuleJarName
+
+

The base name of the jar containing the merged module.
+defaultValue: archiveBaseName.merged.module
+usage example: mergedModuleJarName = 'my-merged-module'

+
+
mergedModuleJarVersion
+
+

The version of the merged module.
+This property is deprecated and it will be removed in a future release. Use the version property of the mergedModule block instead. +If both this property and the version property of the mergedModule block are used, version takes precedence.
+ defaultValue: project.version
+ usage example: mergedModuleJarVersion = '2.1.7'

+
+
options
+
+

A list of options to be passed to jlink.
+defaultValue: empty list
+usage example: options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']

+
+
+
+
+
+
javaHome
+
+

The path to the JDK providing the tools needed by the plugin (javac, jar, jlink etc.).
+defaultValue: the first non-empty value from:
+      - the badass.jlink.java.home system property
+      - the BADASS_JLINK_JAVA_HOME environment variable
+      - the Java toolchain configured in the Gradle script
+      - the java.home system property (only if it points to a JRE containing the javac, jar, and jlink tools)
+      - the JAVA_HOME environment variable
+usage example: javaHome = '/usr/lib/jvm/open-jdk'

+
+
configuration
+
+

The name of the Gradle dependency configuration used to execute your application.
+defaultValue: 'runtimeClasspath'
+usage example: configuration = 'myAppRuntime'

+
+
+
+
+
+

Methods

+
+
+
addOptions(String…​ options)
+
+

Adds options to be passed to jlink. +It is an alternative way of setting the options property. +You can call this method multiple times.
+ usage example: addOptions '--no-header-files', '--no-man-pages'

+
+
forceMerge(String…​ jarPrefixes)
+
+

Instructs the plugin to include all dependencies matching the given prefixes into the merged module. (Note that these are prefixes of the names of the JAR files to be merged.)
+This method is useful when the plugin should handle one or more modular jars as non-modular. +You can call this method multiple times.
+ usage example: forceMerge 'slf4j'

+
+
addExtraDependencies(String…​ jarPrefixes)
+
+

Instructs the plugin to treat all jars matching the given prefixes as dependencies of the merged module.
+A typical situation where this method is needed involves libraries using JavaFX. +Some libraries do not specify their JavaFX dependencies, because JavaFX was part of the JDK before being removed in Java 11.
+Including addExtraDependencies("javafx") into the jlink block solves this problem.

+
+
addExtraModulePath(String modulePath)
+
+

Instructs the plugin to include the specified modulePath in the list of paths passed to the --module-path option of jlink.
+You can call this method multiple times.
+ usage example: addExtraModulePath '/usr/lib/jmods'

+
+
+
+
+
+
jarExclude(String jarPrefix, String…​ excludePatterns)
+
+

Instructs the prepareMergedJarsDir task to exclude some files and/or directories when unpacking the non-modular dependencies.
+jarPrefix: prefix of the names of the JAR files for which the excludePatterns apply.
+excludePatterns: ANT like exclude patterns.
+usage example: jarExclude("netty", "**/license/")

+
+
targetPlatform(String name, String jdkHome, List<String> options = [])
+
+

Instructs the plugin to generate an application image for a specific platform.
+This method is not for configuring the installable packages produced by jpackage. See details
+By default, the plugin generates an image for the platform it runs on. +To create images for other platforms, you need to call the targetPlatform method (one call per target platform).
+name: an identifier of your choice that will be appended to the imageDir and imageZip properties to +determine the location of the image directory and of the image archive.
+jdkHome: the path to the target platform JDK.
+options: an optional list of platform-specific options. +These options will pe passed to jlink in addition to those provided by the options property of the jlink extension.
+NOTE: This is only a convenience method. There is a more powerful targetPlatform method (described below), which allows configuring additional parameters of the target platform.

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    targetPlatform('linux-x64', '/usr/lib/jvm/jdk_x64_linux_hotspot_11_28')
+    targetPlatform('linux-s390x', '/usr/lib/jvm/jdk_s390x_linux_hotspot_11_28',
+                                                               ['--endian', 'big'])
+    ...
+}
+
+
+
+

For a project named hello, executing the jlinkZip task with the above configuration, and assuming default values for the other properties, +the plugin will generate the platform-specific images in the directories +build/image/hello-linux-x64 and build/image/hello-linux-s390x. +The archived images will be available in build/image-linux-x64.zip and build/image-linux-s390x.zip.

+
+
+
+
targetPlatform(String name, Action<TargetPlatform> action)
+
+

This more powerful version of the targetPlatform method allows configuring the target platform parameters using a script block.
+This method is not for configuring the installable packages produced by jpackage. See details
+name: an identifier of your choice that will be appended to the imageDir and imageZip properties to +determine the location of the image directory and of the image archive.
+action: a script block for configuring the target platform parameters.
+     Parameters:
+         jdkHome: the path to the target platform JDK.
+         options: an optional list of platform-specific options.
+     Methods:
+         addOptions(String…​ options): an alternative way of setting the options property.
+         addExtraModulePath(String path): pass the specified path to the --module-path option of jlink.
+             This method can be used to specify the location of the platform-specific OpenJFX modules.
+         jdkDownload(String downloadUrl, Closure downloadConfig=null): helper method for setting jdkHome.
+             It downloads and unpacks a JDK distribution from the given URL.
+             The optional closure allows configuring the following parameters:
+               - downloadDir: the directory in which the distribution is downloaded and unpacked.
+                   defaultValue: buildDir/jdks/targetPlatform-name
+               - archiveName: the name under which the archived distribution should be saved.
+                   defaultValue: jdk
+               - archiveExtension: accepted values: tar.gz and zip.
+                   defaultValue: null (inferred from the URL)
+               - pathToHome: the relative path to the JDK home in the unpacked distribution.
+                   defaultValue: null (inferred by scanning the unpacked distribution)
+               - overwrite: if true, the plugin overwrites an already existing distribution.
+                   defaultValue: false

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    targetPlatform("linux-s390x") {
+        jdkHome = "/usr/lib/jvm/linux-s390x/jdk-14.0.1_7"
+        addOptions("--endian", "big")
+        addExtraModulePath("/usr/lib/openjfx/linux-s390x/jmods")
+    }
+
+    targetPlatform("win") {
+        jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7.1/OpenJDK14U-jdk_x64_windows_hotspot_14.0.1_7.zip")
+        addExtraModulePath("/usr/lib/openjfx/win/jmods")
+    }
+
+    targetPlatform("mac") {
+        jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7/OpenJDK14U-jdk_x64_mac_hotspot_14.0.1_7.tar.gz") {
+            downloadDir = "$buildDir/myMac"
+            archiveName = "my-mac-jdk"
+            archiveExtension = "tar.gz"
+            pathToHome = "jdk-14.0.1+7/Contents/Home"
+            overwrite = true
+        }
+        addExtraModulePath("/usr/lib/openjfx/mac/jmods")
+    }
+    ...
+}
+
+
+
+
+
enableCds(Action<CdsData> action = null)
+
+

Experimental - requires Java 13 or newer
+Enables Class Data Sharing (CDS).
+action: an optional script block for configuring the class data sharing.
+     Parameters:
+         sharedArchiveFile: the path and name of the class data sharing archive file.
+             It supports the Mustache syntax and placeholders described in the launcher section.
+             defaultValue:
+                 lib/server/<appName>.jsa on Unix-like systems
+                 bin\server\<appName>.jsa on Windows

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    enableCds()
+}
+
+
+
+

     or

+
+
+
+
jlink {
+    ...
+    enableCds {
+        sharedArchiveFile = "{{HOME_DIR}}/myApp.jsa"
+    }
+}
+
+
+
+

When the enableCds method is used, the plugin creates a base CDS archive of the image by executing +$imageDir/bin/java -Xshare:dump. This means that you cannot use enableCds when targeting another platform.

+
+
+

When the customImage method is used, some modules are not included in the custom runtime image. +In this case, to allow class data sharing for the excluded modules, the plugin also configures a dynamic AppCDS archive in the start scripts. +If no file is found at the sharedArchiveFile location, the application is started with the -XX:ArchiveClassesAtExit option, +which will create a dynamic AppCDS archive at this location. +Otherwise, the application is started with the -XX:SharedArchiveFile option and uses the existing AppCDS archive.

+
+
+

NOTE: Start scripts are not included in the installable packages generated by jpackage. +As a result, only the base CDS archive of the image is used by the packaged application.

+
+
+
+

Script blocks

+
+

The jlink extension can also contain the script blocks detailed below.

+
+
+

mergedModule

+
+

The mergedModule block allows you to configure the module descriptor of the merged module. +It provides a DSL that matches the syntax of the directives in a module declaration file (module-info.java), +but it requires quotes around the names of modules, services, and service implementation classes.

+
+
+

The plugin automatically exports all packages found in the merged module, therefore the DSL does not support exports directives.

+
+
+

If a mergedModule block appears in your build script, the generated module descriptor will contain the clauses specified in this block. +Otherwise, the module descriptor is created using the algorithm implemented by the suggestMergedModuleInfo task.

+
+
+
+
version
+
+

The version of the merged module.
+defaultValue: the version of the main module, if available; otherwise, the project version
+usage example: version = "1.0.0"

+
+
additive
+
+

In many cases the suggested descriptor is just the right one for your merged module, so you don’t need to provide a mergedModule block. +In some other cases the suggested descriptor is almost right, in the sense that it only misses one or a few clauses. +In these cases you are allowed to configure only the missing clauses in the mergedModule block and instruct the plugin +to add them to the suggested descriptor by setting the attribute additive to true.
+ defaultValue: false
+ usage example: additive = true

+
+
+
+
+

There are also situations where the suggested descriptor contains some unwanted clauses. +The plugin provides a few methods that allow excluding these clauses:

+
+
+
+
excludeRequires(String…​ modules)
+
+

Instructs the plugin to not generate requires clauses for the specified modules.
+usage example: excludeRequires 'java.rmi', 'java-compiler'

+
+
excludeUses(String…​ services)
+
+

Instructs the plugin to not generate uses clauses for the specified services.
+usage example: excludeUses 'java.nio.file.spi.FileSystemProvider'

+
+
excludeProvides(Map constraints)
+
+

Instructs the plugin to not generate provides clauses that match the specified constraints.
+The following keys are allowed in the constraints map:
+service: the qualified name of the service
+implementation: the qualified name of the implementation class
+servicePattern: the regular expression to be matched by the qualified name of the service
+implementationPattern: the regular expression to be matched by the qualified name of the implementation class
+ usage example: excludeProvides servicePattern: 'org.codehaus.stax2.*'

+
+
+
+
+

By calling one of the above methods you automatically enable the additive mode. +This means that it’s no longer necessary to explicitly set the additive property to true.

+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    mergedModule {
+        additive = true  // redundant, because excludeXXX() methods are also present
+        requires 'java.desktop'
+        requires transitive 'java.sql'
+        uses 'java.sql.Driver'
+        provides 'java.sql.Driver' with 'org.hsqldb.jdbc.JDBCDriver'
+        excludeRequires 'java.compiler', 'java.rmi'
+        excludeUses 'org.apache.logging.log4j.message.ThreadDumpMessage.ThreadInfoFactory'
+        excludeProvides servicePattern: 'org.apache.logging.*'
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    mergedModule {
+        additive = true  // redundant, because excludeXXX() methods are also present
+        requires("java.desktop")
+        requiresTransitive("java.sql")
+        uses("java.sql.Driver")
+        provides("java.sql.Driver").with("org.hsqldb.jdbc.JDBCDriver")
+        excludeRequires("java.compiler", "java.rmi")
+        excludeUses("org.apache.logging.log4j.message.ThreadDumpMessage.ThreadInfoFactory")
+        excludeProvides(mapOf("servicePattern" to "org.apache.logging.*"))
+    }
+    ...
+}
+
+
+
+
+

launcher

+
+

The plugin generates script files for launching your application. +These script files can be customized by configuring the launcher block.

+
+
+

Environment variables can be included by using the Mustache syntax, +that is, by enclosing their name between {{ and }}. +Additionally, you can use the following placeholders:

+
+
+
    +
  • +

    {{BIN_DIR}} - the bin directory of the custom runtime image

    +
  • +
  • +

    {{HOME_DIR}} - user’s home directory ($HOME on Unix-like systems, %USERPROFILE% on Windows)

    +
    +
    +
    name
    +
    +

    The base name of the script files used to launch your application.
    +defaultValue: project.name

    +
    +
    jvmArgs
    +
    +

    list of JVM arguments to be passed to the java executable.
    +defaultValue: the arguments configured in the applicationDefaultJvmArgs property of the application extension

    +
    +
    args
    +
    +

    list of arguments to be passed to the application.
    +defaultValue: the arguments configured in the args property of the run task

    +
    +
    noConsole
    +
    +

    This boolean property has an effect only on Windows. It is ignored on other platforms.
    +If true, the application will be launched without an associated console window (using javaw instead of java).
    +defaultValue: false

    +
    +
    unixScriptTemplate
    +
    +

    the template for generating the script file for Unix-like systems.
    +defaultValue: null (the plugin uses its own template)

    +
    +
    windowsScriptTemplate
    +
    +

    the template for generating the script file for Windows-based systems.
    +defaultValue: null (the plugin uses its own template)

    +
    +
    +
    +
  • +
+
+
+

The plugin uses Groovy’s SimpleTemplateEngine +to parse the templates, with the following variables available:

+
+
+
    +
  • +

    moduleName

    +
  • +
  • +

    mainClassName

    +
  • +
  • +

    jvmArgs

    +
  • +
  • +

    args

    +
  • +
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    launcher {
+        name = 'my-app'
+        jvmArgs = [
+            '-Dlog4j.debug=true', '-Dlog4j.configurationFile={{BIN_DIR}}/log4j2.xml',
+            '-DdbHost', '{{PGHOST}}'
+        ]
+        args = ['--user', 'alice']
+        unixScriptTemplate = file('unixStartScript.txt')
+        windowsScriptTemplate = file('windowsStartScript.txt')
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    launcher {
+        name = "my-app"
+        jvmArgs = listOf(
+            "-Dlog4j.debug=true", "-Dlog4j.configurationFile={{BIN_DIR}}/log4j2.xml",
+            "-DdbHost", "{{PGHOST}}"
+        )
+        args = listOf("--user", "alice")
+        unixScriptTemplate = file("unixStartScript.txt")
+        windowsScriptTemplate = file("windowsStartScript.txt")
+    }
+    ...
+}
+
+
+
+
+

secondaryLauncher

+
+

The plugin can generate script files for additional applications besides the main one. +For each additional application you configure a secondaryLauncher block. +This block supports all properties of the launcher block and also the following ones:

+
+
+
+
mainClass
+
+

the main class of this additional application.

+
+
moduleName
+
+

the module containing the main class of this additional application.
+defaultValue: the value of the moduleName property in the enclosing jlink extension

+
+
+
+
+

The following properties affect only the launchers produced by jpackage:

+
+
+
+
icon
+
+

the path to the icon used for this additional launcher.
+defaultValue: null (the icon of the main launcher is used)

+
+
winConsole
+
+

boolean value specifying whether Windows should start the application in a console window.
+defaultValue: null (the win-console settings of the main launcher are used)

+
+
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    secondaryLauncher {
+        name = 'my-additional-app'
+        mainClass = 'org.example.MyAdditionalApp'
+        args = ['--user', 'emma']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    launcher {
+        name = "my-additional-app"
+        mainClass = "org.example.MyAdditionalApp"
+        args = listOf("--user", "emma")
+    }
+    ...
+}
+
+
+
+
+

customImage

+
+

By default, all application modules are included in the custom runtime image. +This block allows you to create a custom runtime image containing only some of the application modules.

+
+
+

If the customImage block is empty, the plugin will create a JRE containing only the JDK modules required by your application. +The plugin figures out by itself which JDK modules are needed, but you can use the below property to request a different set of modules.

+
+
+
+
jdkModules
+
+

list of JDK modules to be included in the generated image.
+defaultValue: null (the plugin figures out by itself which JDK modules are needed)

+
+
jdkAdditive
+
+

if true, the custom image will contain both the modules in the jdkModules list and the JDK modules identified as required by the plugin itself. +defaultValue: false

+
+
appModules
+
+

list of application modules to be included in the generated image.
+Modules required by those in this list will be automatically included.
+defaultValue: null (no application modules are included)

+
+
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    mergedModuleName = 'my.merged.module'
+    customImage {
+        jdkModules = ['java.desktop', 'java.xml', 'jdk.unsupported']
+        appModules = ['my.merged.module']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    mergedModuleName = "my.merged.module"
+    customImage {
+        jdkModules = listOf("java.desktop", "java.xml", "jdk.unsupported")
+        appModules = listOf("my.merged.module")
+    }
+    ...
+}
+
+
+
+
+

jpackage

+
+

This script block allows you to customize the jpackage-based generation of platform-specific application images and installers.

+
+
+
+
jpackageHome
+
+

The path to the JDK providing the jpackage tool.
+defaultValue: the first non-empty value from:
+      - the badass.jlink.jpackage.home system property
+      - the BADASS_JLINK_JPACKAGE_HOME environment variable
+      - the Java toolchain configured in the Gradle script
+      - the java.home system property (only if it points to a JRE containing the jpackage tool)
+      - the JAVA_HOME environment variable
+usage example: jpackageHome = "/usr/lib/jvm/jdk16"

+
+
outputDir
+
+

Convenience property for setting both imageOutputDir and +installerOutputDir with the value buildDir/outputDir.
+ defaultValue: "jpackage"
+ usage example: outputDir = "my-packaging"

+
+
imageOutputDir
+
+

the directory passed as argument to the --output option of jpackage when executing the jpackageImage task . +defaultValue: buildDir/outputDir
+usage example: imageOutputDir = file("$buildDir/my-packaging-image")

+
+
imageName
+
+

the argument passed to the --name option when executing the jpackageImage task.
+defaultValue: the name value configured in the launcher block or project.name
+usage example: imageName = "MyApp"
+It’s recommended to use the same value as for the installerName property.

+
+
imageOptions
+
+

list of additional options to be passed to the jpackage executable when executing the jpackageImage task.
+defaultValue: empty list
+usage example: imageOptions = ["--win-console"]

+
+
resourceDir
+
+

the directory passed as argument to the --resource-dir option when running jpackage to create an application installer. +It is also applicable when creating an application image when you want your own application image instead of the default java image.
+ usage example: resourceDir = file("$buildDir/my-packaging-resources")

+
+
skipInstaller
+
+

boolean value that lets you generate only the platform-specific application image and skip the generation of the platform-specific application installer.
+defaultValue: false
+usage example: skipInstaller = true

+
+
installerType
+
+

the type of installer to be generated.
+defaultValue: null (all supported types for the current platform will be generated)
+usage example: installerType = "rpm"

+
+
installerOutputDir
+
+

the directory passed as argument to the --output option when running jpackage when executing the jpackage task. +defaultValue: buildDir/outputDir
+usage example: installerOutputDir = file("$buildDir/my-packaging-installer")

+
+
installerName
+
+

the argument passed to the --name option when running jpackage when executing the jpackage task.
+defaultValue: the name value configured in the launcher block or project.name
+usage example: installerName = "MyApp"
+It’s recommended to use the same value as for the imageName property.

+
+
appVersion
+
+

the argument passed to the --app-version option when running jpackage when executing the jpackage and jpackageImage tasks.
+defaultValue: the project version
+usage example: appVersion = "1.0.0"

+
+
icon
+
+

the path to the custom application icon.
+This is a convenience property equivalent to configuring --icon in the imageOptions list.
+defaultValue: null (the default icon is used)

+
+
vendor
+
+

the vendor name.
+This is a convenience property equivalent to configuring --vendor in the imageOptions list.
+defaultValue: Unknown

+
+
jvmArgs
+
+

list of JVM arguments to be passed to the virtual machine.
+defaultValue: the jvmArgs value configured in the launcher block, or the arguments configured in the applicationDefaultJvmArgs property of the application extension

+
+
args
+
+

list of arguments to be passed to the application.
+defaultValue: the args value configured in the launcher block, or the arguments configured in the args property of the run task

+
+
+
+
+

NOTE: If args or jvmArgs is not set, and the default value is taken from the launcher block, it may contain the placeholder {{BIN_DIR}}. +The plugin replaces this placeholder with $APPDIR/.. when passing the arguments to jpackage. +This is the correct approach in most cases. If not, you need to explicitly configure args or jvmArgs in the jpackage block.
+Currently, jpackage doesn’t support environment variables in --java-options. +Therefore, you cannot use environment variable names enclosed between {{ and }} in jvmArgs.

+
+
+
+
installerOptions
+
+

list of additional options to be passed to the jpackage executable when executing the jpackage task.
+defaultValue: empty list
+usage example: installerOptions = ["--win-console"]

+
+
targetPlatformName
+
+

This property is required only when using the targetPlatform method. +It specifies which of the images produced by jlink should be used as runtime image by jpackage. +Its value must match the name provided in one of the calls to the targetPlatform method.
+defaultValue: null
+usage example: targetPlatformName = "linux"

+
+
+
+
+ + + + + +
+ + +In contrast to jlink, jpackage is not able to produce installers for other platforms. +For example, to create an installer for Linux, you must run jpackage on a Linux machine. +You cannot do it on a Windows or Mac platform. +
+
+
+ + + + + +
+ + +If you need to create installers for more than one platform, it’s probably better not to use targetPlatform. +Instead, you run the same build on different machines. +If your project is on GitHub, you can automate this by using GitHub Actions, as seen in this example. +
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    jpackage {
+        jpackageHome = '/usr/lib/jvm/jdk16'
+        outputDir = 'my-packaging'
+        // imageOutputDir = file("$buildDir/my-packaging-image")
+        // installerOutputDir = file("$buildDir/my-packaging-installer")
+        imageName = 'MyApp'
+        imageOptions = ['--win-console']
+        skipInstaller = false
+        installerName = 'MyApp'
+        installerType = 'msi'
+        installerOptions = ['--win-console', '--win-menu', '--win-shortcut']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    jpackage {
+        jpackageHome = "/usr/lib/jvm/jdk16"
+        outputDir = "my-packaging"
+        // imageOutputDir = file("$buildDir/my-packaging-image")
+        // installerOutputDir = file("$buildDir/my-packaging-installer")
+        imageName = "MyApp"
+        imageOptions = listOf("--win-console")
+        skipInstaller = false
+        installerName = "MyApp"
+        installerType = "msi"
+        installerOptions = listOf("--win-console", "--win-menu", "--win-shortcut")
+    }
+    ...
+}
+
+
+
+
+
+

How it works

+
+

The plugin combines all non-modular dependencies into a single jar to which it adds a module descriptor. +If the jlink extension contains a mergedModule block, its directives will be used to generate the module descriptor. +Otherwise, a module descriptor is created using the algorithm implemented by the suggestMergedModuleInfo task. +If the attribute additive is set to true in the mergedModule block, the generated module descriptor adds the clauses +specified in this block to the "suggested" descriptor.

+
+
+

The non-modular dependencies appear as automatic modules in the original module graph. +The plugin replaces them with delegating modules, which are dummy modules containing only a module descriptor that +requires transitive the merged module.

+
+
+

The figure below illustrates this process.

+
+
+
+merging +
+
+
+

In some situations, the above approach would lead to cyclic dependencies between modules. +For example, in the module graph below the automatic module org.example.mod1 requires the proper module org.example.mod2. +Because the content of org.example.mod1 gets merged into the merged module, the merged module must require org.example.mod2. +This in turn requires the delegating module org.example.mod3 and hence the merged module.

+
+
+
+merging.cycle +
+
+
+

To prevent such problems, the plugin automatically detects the modular jars that would be involved in a cycle and treats them +as if they were non-modular. +This means that it also merges these modular jars into the merged module and replaces them with delegating modules. +The figure below shows the resulting module graph.

+
+
+
+merging.no cycle +
+
+
+

Sometimes, you may want to have a modular jar treated as non-modular, even if it is not affected by a cyclic dependency problem. +You can do this using the forceMerge method.

+
+
+
+

Task details

+
+

The following properties denote files and directories used by the plugin tasks:

+
+
+
    +
  • +

    imageDir - the directory into which the custom runtime image should be generated.

    +
  • +
  • +

    imageZip - the file into which a zip archive of the custom runtime image should be created.

    +
  • +
  • +

    jlinkBasePath - the path to the base working directory of the plugin. +The table below shows the variable names of the subdirectories created here and their relative path to the base working directory:

    +
  • +
+
+
+

+

+ ++++ + + + + + + + +
Variable namePath relative to jlinkBasePath
mergedJarsDirmergedjars
tmpMergedModuleDirtmpmerged
jlinkJarsDirjlinkjars
tmpjars
tmpModuleInfoDirtmpmodinfo
delegatingModulesDirdelegating
+
+

+
+
+

prepareMergedJarsDir

+
+
+
- clean jlinkBasePath
+- copy modular jars required by non-modular jars to jlinkJarsDir
+- copy non-modular jars to nonModularJarsDir
+- unpack all jars from nonModularJarsDir into mergedJarsDir
+- create MANIFEST.MF in mergedJarsDir
+
+
+
+
+

createMergedModule

+
+
+
- archive mergedJarsDir into tmpMergedModuleDir/mergedModuleName.jar
+- generate module-info.java for the above merged jar into tmpJarsDir
+- clean tmpModuleInfoDir and unpack the merged jar in it
+- compile the generated module-info.java into tmpModuleInfoDir
+        using jlinkJarsDir as module-path
+- copy mergedJarsDir into tmpModuleInfoDir
+- re-create tmpMergedModuleDir/mergedModuleName.jar by archiving tmpModuleInfoDir
+
+
+
+
+

createDelegatingModules

+
+
+
- delete tmpJarsDir
+- for each file in nonModularJarsDir:
+    - create delegating module-info.java into tmpJarsDir/<current-module-name>
+    - clean tmpModuleInfoDir and create MANIFEST.MF in it
+    - compile module-info.java into
+            tmpModuleInfoDir with jlinkJarsDir as module-path
+    - create a jar of tmpModuleInfoDir into delegatingModulesDir
+
+
+
+
+

prepareModulesDir

+
+
+
- copy delegating modules from delegatingModulesDir to jlinkJarsDir
+- copy modular jars not required by non-modular jars to jlinkJarsDir
+- copy the main module jar from project.jar.archivePath to jlinkJarsDir
+- adjust all module descriptors containing qualified exports or opens clauses
+        referring to modules integrated in the merged module. These clauses
+        will be changed to also refer to the merged module.
+
+
+
+
+ +
+
+
- delete imageDir
+- create custom runtime image in imageDir by executing jlink
+        with modules from jlinkJarsDir
+
+
+
+
+

jlinkZip

+
+
+
- zip imageDir to imageZip
+
+
+
+
+

suggestMergedModuleInfo

+
+
+
- determine the modules required by the merged module
+- determine the services used by the merged module
+- determine the services provided by the merged module
+- print the suggested `mergedModule` block
+
+
+
+
+
Options
+
language
+
+

the DSL for which the mergedModule block should be displayed.
+default value: groovy
+accepted values: groovy, kotlin, java
+usage example: ./gradlew suggestMergedModuleInfo --language=kotlin

+
+
+
+
+
+

jpackageImage

+
+
+
- create a platform-specific application image in imageOutputDir by executing:
+        jpackage --type app-image --runtime-image imageDir --module-path jlinkJarsDir ...
+
+
+
+

The properties imageOutputDir and imageDir +can be configured in the jpackage script block.

+
+
+
+

jpackage

+
+
+
- if skipInstaller is false:
+        create a platform-specific application installer in installerOutputDir by executing:
+        jpackage --type installerType --app-image=imageOutputDir/imageName ...
+
+
+
+

The properties installerOutputDir, installerType, imageOutputDir, and imageName +can be configured in the jpackage script block.

+
+
+

If no installerType has been configured, the plugin will run jpackage several times, one for each type supported by the current platform.

+
+
+
+
+
+
+

Examples

+
+
+

The following projects illustrate how to use this plugin to create custom runtime images:

+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/releases/3.0.0/asciidoctor.css b/releases/3.0.0/asciidoctor.css new file mode 100644 index 00000000..9d9cc70c --- /dev/null +++ b/releases/3.0.0/asciidoctor.css @@ -0,0 +1,426 @@ +/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ +/* Uncomment @import statement to use as custom stylesheet */ +/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/ +article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block} +audio,video{display:inline-block} +audio:not([controls]){display:none;height:0} +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%} +a{background:none} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1{font-size:2em;margin:.67em 0} +abbr[title]{border-bottom:1px dotted} +b,strong{font-weight:bold} +dfn{font-style:italic} +hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:monospace;font-size:1em} +pre{white-space:pre-wrap} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-.5em} +sub{bottom:-.25em} +img{border:0} +svg:not(:root){overflow:hidden} +figure{margin:0} +fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,select{text-transform:none} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} +button[disabled],html input[disabled]{cursor:default} +input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} +html,body{font-size:100%} +body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} +a:hover{cursor:pointer} +img,object,embed{max-width:100%;height:auto} +object,embed{height:100%} +img{-ms-interpolation-mode:bicubic} +.left{float:left!important} +.right{float:right!important} +.text-left{text-align:left!important} +.text-right{text-align:right!important} +.text-center{text-align:center!important} +.text-justify{text-align:justify!important} +.hide{display:none} +img,object,svg{display:inline-block;vertical-align:middle} +textarea{height:auto;min-height:50px} +select{width:100%} +.center{margin-left:auto;margin-right:auto} +.stretch{width:100%} +.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} +div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr} +a{color:#2156a5;text-decoration:underline;line-height:inherit} +a:hover,a:focus{color:#1d4b8f} +a img{border:0} +p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} +p aside{font-size:.875em;line-height:1.35;font-style:italic} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} +h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} +h1{font-size:2.125em} +h2{font-size:1.6875em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} +h4,h5{font-size:1.125em} +h6{font-size:1em} +hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0} +em,i{font-style:italic;line-height:inherit} +strong,b{font-weight:bold;line-height:inherit} +small{font-size:60%;line-height:inherit} +code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} +ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} +ul,ol{margin-left:1.5em} +ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em} +ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} +ul.square{list-style-type:square} +ul.circle{list-style-type:circle} +ul.disc{list-style-type:disc} +ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} +dl dt{margin-bottom:.3125em;font-weight:bold} +dl dd{margin-bottom:1.25em} +abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help} +abbr{text-transform:none} +blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} +blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)} +blockquote cite::before{content:"\2014 \0020"} +blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)} +blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} +@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} +h1{font-size:2.75em} +h2{font-size:2.3125em} +h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} +h4{font-size:1.4375em}} +table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede} +table thead,table tfoot{background:#f7f8f7} +table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} +table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} +table tr.even,table tr.alt{background:#f8f8f7} +table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6} +h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} +h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} +.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} +.clearfix::after,.float-group::after{clear:both} +:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word} +:not(pre)>code.nobreak{word-wrap:normal} +:not(pre)>code.nowrap{white-space:nowrap} +pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} +pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} +pre>code{display:block} +pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} +em em{font-style:normal} +strong strong{font-weight:400} +.keyseq{color:rgba(51,51,51,.8)} +kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} +.keyseq kbd:first-child{margin-left:0} +.keyseq kbd:last-child{margin-right:0} +.menuseq,.menuref{color:#000} +.menuseq b:not(.caret),.menuref{font-weight:inherit} +.menuseq{word-spacing:-.02em} +.menuseq b.caret{font-size:1.25em;line-height:.8} +.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} +b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} +b.button::before{content:"[";padding:0 3px 0 2px} +b.button::after{content:"]";padding:0 2px 0 3px} +p a>code:hover{color:rgba(0,0,0,.9)} +#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} +#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} +#header::after,#content::after,#footnotes::after,#footer::after{clear:both} +#content{margin-top:1.25em} +#content::before{content:none} +#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} +#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} +#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} +#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap} +#header .details span:first-child{margin-left:-.125em} +#header .details span.email a{color:rgba(0,0,0,.85)} +#header .details br{display:none} +#header .details br+span::before{content:"\00a0\2013\00a0"} +#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} +#header .details br+span#revremark::before{content:"\00a0|\00a0"} +#header #revnumber{text-transform:capitalize} +#header #revnumber::after{content:"\00a0"} +#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} +#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} +#toc>ul{margin-left:.125em} +#toc ul.sectlevel0>li>a{font-style:italic} +#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} +#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} +#toc li{line-height:1.3334;margin-top:.3334em} +#toc a{text-decoration:none} +#toc a:active{text-decoration:underline} +#toctitle{color:#7a2518;font-size:1.2em} +@media screen and (min-width:768px){#toctitle{font-size:1.375em} +body.toc2{padding-left:15em;padding-right:0} +#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} +#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} +#toc.toc2>ul{font-size:.9em;margin-bottom:0} +#toc.toc2 ul ul{margin-left:0;padding-left:1em} +#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} +body.toc2.toc-right{padding-left:0;padding-right:15em} +body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} +@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} +#toc.toc2{width:20em} +#toc.toc2 #toctitle{font-size:1.375em} +#toc.toc2>ul{font-size:.95em} +#toc.toc2 ul ul{padding-left:1.25em} +body.toc2.toc-right{padding-left:0;padding-right:20em}} +#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} +#content #toc>:first-child{margin-top:0} +#content #toc>:last-child{margin-bottom:0} +#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em} +#footer-text{color:rgba(255,255,255,.8);line-height:1.44} +#content{margin-bottom:.625em} +.sect1{padding-bottom:.625em} +@media screen and (min-width:768px){#content{margin-bottom:1.25em} +.sect1{padding-bottom:1.25em}} +.sect1:last-child{padding-bottom:0} +.sect1+.sect1{border-top:1px solid #e7e7e9} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} +#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} +#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} +#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} +details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} +details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em} +.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} +table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} +.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} +table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit} +.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} +.admonitionblock>table td.icon{text-align:center;width:80px} +.admonitionblock>table td.icon img{max-width:none} +.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} +.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)} +.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} +.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px} +.exampleblock>.content>:first-child{margin-top:0} +.exampleblock>.content>:last-child{margin-bottom:0} +.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px} +.sidebarblock>:first-child{margin-top:0} +.sidebarblock>:last-child{margin-bottom:0} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} +.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em} +@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} +@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} +.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} +.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} +.listingblock>.content{position:relative} +.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} +.listingblock:hover code[data-lang]::before{display:block} +.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} +.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} +.listingblock pre.highlightjs{padding:0} +.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px} +.listingblock pre.prettyprint{border-width:0} +.prettyprint{background:#f7f7f8} +pre.prettyprint .linenums{line-height:1.45;margin-left:2em} +pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} +pre.prettyprint li code[data-lang]::before{opacity:1} +pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} +table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} +table.linenotable td.code{padding-left:.75em} +table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em} +pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em} +pre.pygments .lineno::before{content:"";margin-right:-.125em} +.quoteblock{margin:0 1em 1.25em 1.5em;display:table} +.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} +.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} +.quoteblock blockquote{margin:0;padding:0;border:0} +.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} +.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} +.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} +.verseblock{margin:0 1em 1.25em} +.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} +.verseblock pre strong{font-weight:400} +.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} +.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} +.quoteblock .attribution br,.verseblock .attribution br{display:none} +.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} +.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} +.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} +.quoteblock.abstract{margin:0 1em 1.25em;display:block} +.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} +.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} +.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} +.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} +.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0} +table.tableblock{max-width:100%;border-collapse:separate} +p.tableblock:last-child{margin-bottom:0} +td.tableblock>.content>:last-child{margin-bottom:-1.25em} +td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0} +table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} +table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0} +table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0} +table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0} +table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px} +table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0} +table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0} +table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0} +table.frame-all{border-width:1px} +table.frame-sides{border-width:0 1px} +table.frame-topbot,table.frame-ends{border-width:1px 0} +table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7} +th.halign-left,td.halign-left{text-align:left} +th.halign-right,td.halign-right{text-align:right} +th.halign-center,td.halign-center{text-align:center} +th.valign-top,td.valign-top{vertical-align:top} +th.valign-bottom,td.valign-bottom{vertical-align:bottom} +th.valign-middle,td.valign-middle{vertical-align:middle} +table thead th,table tfoot th{font-weight:bold} +tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7} +tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} +p.tableblock>code:only-child{background:none;padding:0} +p.tableblock{font-size:1em} +ol{margin-left:1.75em} +ul li ol{margin-left:1.5em} +dl dd{margin-left:1.125em} +dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} +ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} +ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} +ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} +ul.unstyled,ol.unstyled{margin-left:0} +ul.checklist{margin-left:.625em} +ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} +ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em} +ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} +ul.inline>li{margin-left:1.25em} +.unstyled dl dt{font-weight:400;font-style:normal} +ol.arabic{list-style-type:decimal} +ol.decimal{list-style-type:decimal-leading-zero} +ol.loweralpha{list-style-type:lower-alpha} +ol.upperalpha{list-style-type:upper-alpha} +ol.lowerroman{list-style-type:lower-roman} +ol.upperroman{list-style-type:upper-roman} +ol.lowergreek{list-style-type:lower-greek} +.hdlist>table,.colist>table{border:0;background:none} +.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} +td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} +td.hdlist1{font-weight:bold;padding-bottom:1.25em} +.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} +.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} +.colist td:not([class]):first-child img{max-width:none} +.colist td:not([class]):last-child{padding:.25em 0} +.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd} +.imageblock.left{margin:.25em .625em 1.25em 0} +.imageblock.right{margin:.25em 0 1.25em .625em} +.imageblock>.title{margin-bottom:0} +.imageblock.thumb,.imageblock.th{border-width:6px} +.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} +.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} +.image.left{margin-right:.625em} +.image.right{margin-left:.625em} +a.image{text-decoration:none;display:inline-block} +a.image object{pointer-events:none} +sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} +sup.footnote a,sup.footnoteref a{text-decoration:none} +sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} +#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} +#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} +#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} +#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} +#footnotes .footnote:last-of-type{margin-bottom:0} +#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} +.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0} +.gist .file-data>table td.line-data{width:99%} +div.unbreakable{page-break-inside:avoid} +.big{font-size:larger} +.small{font-size:smaller} +.underline{text-decoration:underline} +.overline{text-decoration:overline} +.line-through{text-decoration:line-through} +.aqua{color:#00bfbf} +.aqua-background{background:#00fafa} +.black{color:#000} +.black-background{background:#000} +.blue{color:#0000bf} +.blue-background{background:#0000fa} +.fuchsia{color:#bf00bf} +.fuchsia-background{background:#fa00fa} +.gray{color:#606060} +.gray-background{background:#7d7d7d} +.green{color:#006000} +.green-background{background:#007d00} +.lime{color:#00bf00} +.lime-background{background:#00fa00} +.maroon{color:#600000} +.maroon-background{background:#7d0000} +.navy{color:#000060} +.navy-background{background:#00007d} +.olive{color:#606000} +.olive-background{background:#7d7d00} +.purple{color:#600060} +.purple-background{background:#7d007d} +.red{color:#bf0000} +.red-background{background:#fa0000} +.silver{color:#909090} +.silver-background{background:#bcbcbc} +.teal{color:#006060} +.teal-background{background:#007d7d} +.white{color:#bfbfbf} +.white-background{background:#fafafa} +.yellow{color:#bfbf00} +.yellow-background{background:#fafa00} +span.icon>.fa{cursor:default} +a span.icon>.fa{cursor:inherit} +.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} +.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} +.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} +.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} +.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} +.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} +.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} +.conum[data-value] *{color:#fff!important} +.conum[data-value]+b{display:none} +.conum[data-value]::after{content:attr(data-value)} +pre .conum[data-value]{position:relative;top:-.125em} +b.conum *{color:inherit!important} +.conum:not([data-value]):empty{display:none} +dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} +h1,h2,p,td.content,span.alt{letter-spacing:-.01em} +p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} +p,blockquote,dt,td.content,span.alt{font-size:1.0625rem} +p{margin-bottom:1.25rem} +.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} +.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc} +.print-only{display:none!important} +@page{margin:1.25cm .75cm} +@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important} +html{font-size:80%} +a{color:inherit!important;text-decoration:underline!important} +a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} +a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} +abbr[title]::after{content:" (" attr(title) ")"} +pre,blockquote,tr,img,object,svg{page-break-inside:avoid} +thead{display:table-header-group} +svg{max-width:100%} +p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} +h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} +#toc,.sidebarblock,.exampleblock>.content{background:none!important} +#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} +body.book #header{text-align:center} +body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} +body.book #header .details{border:0!important;display:block;padding:0!important} +body.book #header .details span:first-child{margin-left:0!important} +body.book #header .details br{display:block} +body.book #header .details br+span::before{content:none!important} +body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} +body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} +.listingblock code[data-lang]::before{display:block} +#footer{padding:0 .9375em} +.hide-on-print{display:none!important} +.print-only{display:block!important} +.hide-for-print{display:none!important} +.show-for-print{display:inherit!important}} +@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem} +.sect1{padding:0!important} +.sect1+.sect1{border:0} +#footer{background:none} +#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} +@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} \ No newline at end of file diff --git a/releases/3.0.0/coderay-asciidoctor.css b/releases/3.0.0/coderay-asciidoctor.css new file mode 100644 index 00000000..d01b0a80 --- /dev/null +++ b/releases/3.0.0/coderay-asciidoctor.css @@ -0,0 +1,87 @@ +/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */ +pre.CodeRay{background:#f7f7f8} +.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0} +.CodeRay span.line-numbers{display:inline-block;margin-right:.75em} +.CodeRay .line-numbers strong{color:#000} +table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none} +table.CodeRay td{vertical-align:top;line-height:inherit} +table.CodeRay td.line-numbers{text-align:right} +table.CodeRay td.code{padding:0 0 0 .75em} +.CodeRay .debug{color:#fff !important;background:#000080 !important} +.CodeRay .annotation{color:#007} +.CodeRay .attribute-name{color:#000080} +.CodeRay .attribute-value{color:#700} +.CodeRay .binary{color:#509} +.CodeRay .comment{color:#998;font-style:italic} +.CodeRay .char{color:#04d} +.CodeRay .char .content{color:#04d} +.CodeRay .char .delimiter{color:#039} +.CodeRay .class{color:#458;font-weight:bold} +.CodeRay .complex{color:#a08} +.CodeRay .constant,.CodeRay .predefined-constant{color:#008080} +.CodeRay .color{color:#099} +.CodeRay .class-variable{color:#369} +.CodeRay .decorator{color:#b0b} +.CodeRay .definition{color:#099} +.CodeRay .delimiter{color:#000} +.CodeRay .doc{color:#970} +.CodeRay .doctype{color:#34b} +.CodeRay .doc-string{color:#d42} +.CodeRay .escape{color:#666} +.CodeRay .entity{color:#800} +.CodeRay .error{color:#808} +.CodeRay .exception{color:inherit} +.CodeRay .filename{color:#099} +.CodeRay .function{color:#900;font-weight:bold} +.CodeRay .global-variable{color:#008080} +.CodeRay .hex{color:#058} +.CodeRay .integer,.CodeRay .float{color:#099} +.CodeRay .include{color:#555} +.CodeRay .inline{color:#000} +.CodeRay .inline .inline{background:#ccc} +.CodeRay .inline .inline .inline{background:#bbb} +.CodeRay .inline .inline-delimiter{color:#d14} +.CodeRay .inline-delimiter{color:#d14} +.CodeRay .important{color:#555;font-weight:bold} +.CodeRay .interpreted{color:#b2b} +.CodeRay .instance-variable{color:#008080} +.CodeRay .label{color:#970} +.CodeRay .local-variable{color:#963} +.CodeRay .octal{color:#40e} +.CodeRay .predefined{color:#369} +.CodeRay .preprocessor{color:#579} +.CodeRay .pseudo-class{color:#555} +.CodeRay .directive{font-weight:bold} +.CodeRay .type{font-weight:bold} +.CodeRay .predefined-type{color:inherit} +.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold} +.CodeRay .key{color:#808} +.CodeRay .key .delimiter{color:#606} +.CodeRay .key .char{color:#80f} +.CodeRay .value{color:#088} +.CodeRay .regexp .delimiter{color:#808} +.CodeRay .regexp .content{color:#808} +.CodeRay .regexp .modifier{color:#808} +.CodeRay .regexp .char{color:#d14} +.CodeRay .regexp .function{color:#404;font-weight:bold} +.CodeRay .string{color:#d20} +.CodeRay .string .string .string{background:#ffd0d0} +.CodeRay .string .content{color:#d14} +.CodeRay .string .char{color:#d14} +.CodeRay .string .delimiter{color:#d14} +.CodeRay .shell{color:#d14} +.CodeRay .shell .delimiter{color:#d14} +.CodeRay .symbol{color:#990073} +.CodeRay .symbol .content{color:#a60} +.CodeRay .symbol .delimiter{color:#630} +.CodeRay .tag{color:#008080} +.CodeRay .tag-special{color:#d70} +.CodeRay .variable{color:#036} +.CodeRay .insert{background:#afa} +.CodeRay .delete{background:#faa} +.CodeRay .change{color:#aaf;background:#007} +.CodeRay .head{color:#f8f;background:#505} +.CodeRay .insert .insert{color:#080} +.CodeRay .delete .delete{color:#800} +.CodeRay .change .change{color:#66f} +.CodeRay .head .head{color:#f4f} \ No newline at end of file diff --git a/releases/3.0.0/index.html b/releases/3.0.0/index.html new file mode 100644 index 00000000..628ee7d8 --- /dev/null +++ b/releases/3.0.0/index.html @@ -0,0 +1,1450 @@ + + + + + + + + +The Badass JLink Plugin + + + + + + + + + + +
+
+

Introduction

+
+
+

The badass-jlink plugin allows you to create custom runtime images for modular applications with minimal effort. +It also lets you create an application installer with the jpackage tool.

+
+
+ + + + + +
+ + +For non-modular applications use the Badass-Runtime plugin. +
+
+
+

Many modular applications have one or more non-modular dependencies, which are treated as automatic modules by the Java platform. +However, jlink cannot work with automatic modules. +The typical way to solve this problem is to convert the non-modular jars to explicit modules, by adding an appropriate module descriptor to each non-modular jar. +This is a tedious process if your application has lots of non-modular dependencies.

+
+
+

The badass-jlink plugin takes a more pragmatic approach by combining all non-modular dependencies into a single jar. +This way, only the resulting merged module needs a module descriptor.

+
+
+

The plugin provides several tasks. The most frequently used are jlink, which creates a custom runtime image in a given directory, +and jlinkZip, which in addition creates a zip archive of the custom runtime image. +With the jpackage task you can create a platform-specific installer for your application.

+
+
+ + + + + +
+ + +The current version of this plugin requires Java 17 and Gradle 7.4 or newer. +While it might work with some combinations of older Java and Gradle versions, these are not officially supported. +If you are forced to work with an older Gradle release, you should use the version 2.25.0 of this plugin. +
+
+
+

To use the plugin, include the following in your build script:

+
+
+
+
plugins {
+    id 'org.beryx.jlink' version '3.0.0'
+}
+
+
+
+

Applying the Badass-JLink plugin also implicitly applies the Application plugin.

+
+
+

The plugin uses an extension named jlink. +The sample below shows a few configuration options.

+
+
+
+
jlink {
+    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
+    launcher{
+        name = 'hello'
+        jvmArgs = ['-Dlog4j.configurationFile=./log4j2.xml']
+    }
+}
+
+
+
+

The next sections provide detailed information on how to configure the plugin.

+
+
+ + + + + +
+ + +The source code is available on GitHub and is licensed under the Apache-2.0 license. +
+
+
+
+
+

User Guide

+
+
+

Creating a custom runtime image can be a challenging task if your application has many non-modular dependencies. +To let you address all possible issues, badass-jlink allows you to configure the jlink extension using various properties, methods and script blocks.

+
+
+

The operations required to create a custom runtime image are grouped in several tasks. +This gives you the possibility to tweak a particular step by hooking into the corresponding task +(via doFirst, doLast, TaskExecutionListener or TaskActionListener).

+
+
+

Tasks

+
+
+
prepareMergedJarsDir
+
+

Unpacks all non-modular dependencies in a designated directory.
+depends on: jar

+
+
createMergedModule
+
+

Creates the merged module using the content of the directory prepared by the previous task and adding a module descriptor to it.
+depends on: prepareMergedJarsDir

+
+
createDelegatingModules
+
+

For each non-modular dependency, it creates a delegating module, which is an open module +consisting only of a module descriptor. The module descriptor specifies that the delegating module requires transitive the merged module.
+ depends on: createMergedModule

+
+
prepareModulesDir
+
+

Copies all modules needed by jlink to a designated directory.
+depends on: createDelegatingModules

+
+
jlink
+
+

Uses the jlink tool to create the custom runtime image.
+depends on: prepareModulesDir

+
+
jlinkZip
+
+

Creates a zip archive of the custom runtime image.
+depends on: jlink

+
+
suggestMergedModuleInfo
+
+

Displays the mergedModule block that will be used if your jlink extension doesn’t include one. +You can use the suggested block as a starting point for your custom mergedModule block.
+ depends on: prepareMergedJarsDir

+
+
jpackageImage
+
+

Uses the jpackage tool to create a platform-specific application image.
+depends on: prepareModulesDir

+
+
jpackage
+
+

Uses the jpackage tool to create a platform-specific application installer.
+depends on: jpackageImage

+
+
+
+
+

A detailed description of these tasks is given in Task details

+
+
+
+

Properties

+
+
+
imageDir
+
+

The directory into which the custom runtime image should be generated.
+(If you use the targetPlatform method to generate images for other platforms, the corresponding images will be created in subdirectories of imageDir.)
+ defaultValue: buildDir/image
+ usage example: imageDir = file("$buildDir/myapp-image")

+
+
imageZip
+
+

The file into which a zip archive of the custom runtime image should be created.
+defaultValue: buildDir/image.zip
+usage example: imageZip = file("$buildDir/myapp-image.zip")

+
+
imageName
+
+

Convenience property for setting the values of both imageDir and imageZip as follows:
+    imageDir ← buildDir/imageName
+    imageZip ← buildDir/imageName.zip
+usage example: imageName = 'hello'

+
+
jlinkBasePath
+
+

The path to the base directory that will be used by the plugin to store intermediate outputs.
+defaultValue: buildDir/jlinkbase
+usage example: jlinkBasePath = "$buildDir/my-jlinkbase"

+
+
mainClass
+
+

The main class to be provided as part of the --launcher option of jlink.
+defaultValue: application.mainClass (from the Application plugin)
+usage example: mainClass = 'org.example.MyApp'

+
+
moduleName
+
+

The module name of this application.
+defaultValue: the module name specified in this application’s module-info.java
+usage example: moduleName = 'org.example.myapp'

+
+
mergedModuleName
+
+

The name of the merged module.
+defaultValue: moduleName.merged.module
+usage example: mergedModuleName = 'org.example.myapp.merged.module'

+
+
mergedModuleJarName
+
+

The base name of the jar containing the merged module.
+defaultValue: archiveBaseName.merged.module
+usage example: mergedModuleJarName = 'my-merged-module'

+
+
mergedModuleJarVersion
+
+

The version of the merged module.
+This property is deprecated and it will be removed in a future release. Use the version property of the mergedModule block instead. +If both this property and the version property of the mergedModule block are used, version takes precedence.
+ defaultValue: project.version
+ usage example: mergedModuleJarVersion = '2.1.7'

+
+
options
+
+

A list of options to be passed to jlink.
+defaultValue: empty list
+usage example: options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']

+
+
+
+
+
+
javaHome
+
+

The path to the JDK providing the tools needed by the plugin (javac, jar, jlink etc.).
+defaultValue: the first non-empty value from:
+      - the badass.jlink.java.home system property
+      - the BADASS_JLINK_JAVA_HOME environment variable
+      - the Java toolchain configured in the Gradle script
+      - the java.home system property (only if it points to a JRE containing the javac, jar, and jlink tools)
+      - the JAVA_HOME environment variable
+usage example: javaHome = '/usr/lib/jvm/open-jdk'

+
+
configuration
+
+

The name of the Gradle dependency configuration used to execute your application.
+defaultValue: 'runtimeClasspath'
+usage example: configuration = 'myAppRuntime'

+
+
+
+
+
+

Methods

+
+
+
addOptions(String…​ options)
+
+

Adds options to be passed to jlink. +It is an alternative way of setting the options property. +You can call this method multiple times.
+ usage example: addOptions '--no-header-files', '--no-man-pages'

+
+
forceMerge(String…​ jarPrefixes)
+
+

Instructs the plugin to include all dependencies matching the given prefixes into the merged module. (Note that these are prefixes of the names of the JAR files to be merged.)
+This method is useful when the plugin should handle one or more modular jars as non-modular. +You can call this method multiple times.
+ usage example: forceMerge 'slf4j'

+
+
addExtraDependencies(String…​ jarPrefixes)
+
+

Instructs the plugin to treat all jars matching the given prefixes as dependencies of the merged module.
+A typical situation where this method is needed involves libraries using JavaFX. +Some libraries do not specify their JavaFX dependencies, because JavaFX was part of the JDK before being removed in Java 11.
+Including addExtraDependencies("javafx") into the jlink block solves this problem.

+
+
addExtraModulePath(String modulePath)
+
+

Instructs the plugin to include the specified modulePath in the list of paths passed to the --module-path option of jlink.
+You can call this method multiple times.
+ usage example: addExtraModulePath '/usr/lib/jmods'

+
+
+
+
+
+
jarExclude(String jarPrefix, String…​ excludePatterns)
+
+

Instructs the prepareMergedJarsDir task to exclude some files and/or directories when unpacking the non-modular dependencies.
+jarPrefix: prefix of the names of the JAR files for which the excludePatterns apply.
+excludePatterns: ANT like exclude patterns.
+usage example: jarExclude("netty", "**/license/")

+
+
targetPlatform(String name, String jdkHome, List<String> options = [])
+
+

Instructs the plugin to generate an application image for a specific platform.
+This method is not for configuring the installable packages produced by jpackage. See details
+By default, the plugin generates an image for the platform it runs on. +To create images for other platforms, you need to call the targetPlatform method (one call per target platform).
+name: an identifier of your choice that will be appended to the imageDir and imageZip properties to +determine the location of the image directory and of the image archive.
+jdkHome: the path to the target platform JDK.
+options: an optional list of platform-specific options. +These options will pe passed to jlink in addition to those provided by the options property of the jlink extension.
+NOTE: This is only a convenience method. There is a more powerful targetPlatform method (described below), which allows configuring additional parameters of the target platform.

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    targetPlatform('linux-x64', '/usr/lib/jvm/jdk_x64_linux_hotspot_11_28')
+    targetPlatform('linux-s390x', '/usr/lib/jvm/jdk_s390x_linux_hotspot_11_28',
+                                                               ['--endian', 'big'])
+    ...
+}
+
+
+
+

For a project named hello, executing the jlinkZip task with the above configuration, and assuming default values for the other properties, +the plugin will generate the platform-specific images in the directories +build/image/hello-linux-x64 and build/image/hello-linux-s390x. +The archived images will be available in build/image-linux-x64.zip and build/image-linux-s390x.zip.

+
+
+
+
targetPlatform(String name, Action<TargetPlatform> action)
+
+

This more powerful version of the targetPlatform method allows configuring the target platform parameters using a script block.
+This method is not for configuring the installable packages produced by jpackage. See details
+name: an identifier of your choice that will be appended to the imageDir and imageZip properties to +determine the location of the image directory and of the image archive.
+action: a script block for configuring the target platform parameters.
+     Parameters:
+         jdkHome: the path to the target platform JDK.
+         options: an optional list of platform-specific options.
+     Methods:
+         addOptions(String…​ options): an alternative way of setting the options property.
+         addExtraModulePath(String path): pass the specified path to the --module-path option of jlink.
+             This method can be used to specify the location of the platform-specific OpenJFX modules.
+         jdkDownload(String downloadUrl, Closure downloadConfig=null): helper method for setting jdkHome.
+             It downloads and unpacks a JDK distribution from the given URL.
+             The optional closure allows configuring the following parameters:
+               - downloadDir: the directory in which the distribution is downloaded and unpacked.
+                   defaultValue: buildDir/jdks/targetPlatform-name
+               - archiveName: the name under which the archived distribution should be saved.
+                   defaultValue: jdk
+               - archiveExtension: accepted values: tar.gz and zip.
+                   defaultValue: null (inferred from the URL)
+               - pathToHome: the relative path to the JDK home in the unpacked distribution.
+                   defaultValue: null (inferred by scanning the unpacked distribution)
+               - overwrite: if true, the plugin overwrites an already existing distribution.
+                   defaultValue: false

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    targetPlatform("linux-s390x") {
+        jdkHome = "/usr/lib/jvm/linux-s390x/jdk-14.0.1_7"
+        addOptions("--endian", "big")
+        addExtraModulePath("/usr/lib/openjfx/linux-s390x/jmods")
+    }
+
+    targetPlatform("win") {
+        jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7.1/OpenJDK14U-jdk_x64_windows_hotspot_14.0.1_7.zip")
+        addExtraModulePath("/usr/lib/openjfx/win/jmods")
+    }
+
+    targetPlatform("mac") {
+        jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7/OpenJDK14U-jdk_x64_mac_hotspot_14.0.1_7.tar.gz") {
+            downloadDir = "$buildDir/myMac"
+            archiveName = "my-mac-jdk"
+            archiveExtension = "tar.gz"
+            pathToHome = "jdk-14.0.1+7/Contents/Home"
+            overwrite = true
+        }
+        addExtraModulePath("/usr/lib/openjfx/mac/jmods")
+    }
+    ...
+}
+
+
+
+
+
enableCds(Action<CdsData> action = null)
+
+

Experimental - requires Java 13 or newer
+Enables Class Data Sharing (CDS).
+action: an optional script block for configuring the class data sharing.
+     Parameters:
+         sharedArchiveFile: the path and name of the class data sharing archive file.
+             It supports the Mustache syntax and placeholders described in the launcher section.
+             defaultValue:
+                 lib/server/<appName>.jsa on Unix-like systems
+                 bin\server\<appName>.jsa on Windows

+
+
+
+ ++++ + + + + + + +
+
Usage example
+
+
jlink {
+    ...
+    enableCds()
+}
+
+
+
+

     or

+
+
+
+
jlink {
+    ...
+    enableCds {
+        sharedArchiveFile = "{{HOME_DIR}}/myApp.jsa"
+    }
+}
+
+
+
+

When the enableCds method is used, the plugin creates a base CDS archive of the image by executing +$imageDir/bin/java -Xshare:dump. This means that you cannot use enableCds when targeting another platform.

+
+
+

When the customImage method is used, some modules are not included in the custom runtime image. +In this case, to allow class data sharing for the excluded modules, the plugin also configures a dynamic AppCDS archive in the start scripts. +If no file is found at the sharedArchiveFile location, the application is started with the -XX:ArchiveClassesAtExit option, +which will create a dynamic AppCDS archive at this location. +Otherwise, the application is started with the -XX:SharedArchiveFile option and uses the existing AppCDS archive.

+
+
+

NOTE: Start scripts are not included in the installable packages generated by jpackage. +As a result, only the base CDS archive of the image is used by the packaged application.

+
+
+
+

Script blocks

+
+

The jlink extension can also contain the script blocks detailed below.

+
+
+

mergedModule

+
+

The mergedModule block allows you to configure the module descriptor of the merged module. +It provides a DSL that matches the syntax of the directives in a module declaration file (module-info.java), +but it requires quotes around the names of modules, services, and service implementation classes.

+
+
+

The plugin automatically exports all packages found in the merged module, therefore the DSL does not support exports directives.

+
+
+

If a mergedModule block appears in your build script, the generated module descriptor will contain the clauses specified in this block. +Otherwise, the module descriptor is created using the algorithm implemented by the suggestMergedModuleInfo task.

+
+
+
+
version
+
+

The version of the merged module.
+defaultValue: the version of the main module, if available; otherwise, the project version
+usage example: version = "1.0.0"

+
+
additive
+
+

In many cases the suggested descriptor is just the right one for your merged module, so you don’t need to provide a mergedModule block. +In some other cases the suggested descriptor is almost right, in the sense that it only misses one or a few clauses. +In these cases you are allowed to configure only the missing clauses in the mergedModule block and instruct the plugin +to add them to the suggested descriptor by setting the attribute additive to true.
+ defaultValue: false
+ usage example: additive = true

+
+
+
+
+

There are also situations where the suggested descriptor contains some unwanted clauses. +The plugin provides a few methods that allow excluding these clauses:

+
+
+
+
excludeRequires(String…​ modules)
+
+

Instructs the plugin to not generate requires clauses for the specified modules.
+usage example: excludeRequires 'java.rmi', 'java-compiler'

+
+
excludeUses(String…​ services)
+
+

Instructs the plugin to not generate uses clauses for the specified services.
+usage example: excludeUses 'java.nio.file.spi.FileSystemProvider'

+
+
excludeProvides(Map constraints)
+
+

Instructs the plugin to not generate provides clauses that match the specified constraints.
+The following keys are allowed in the constraints map:
+service: the qualified name of the service
+implementation: the qualified name of the implementation class
+servicePattern: the regular expression to be matched by the qualified name of the service
+implementationPattern: the regular expression to be matched by the qualified name of the implementation class
+ usage example: excludeProvides servicePattern: 'org.codehaus.stax2.*'

+
+
+
+
+

By calling one of the above methods you automatically enable the additive mode. +This means that it’s no longer necessary to explicitly set the additive property to true.

+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    mergedModule {
+        additive = true  // redundant, because excludeXXX() methods are also present
+        requires 'java.desktop'
+        requires transitive 'java.sql'
+        uses 'java.sql.Driver'
+        provides 'java.sql.Driver' with 'org.hsqldb.jdbc.JDBCDriver'
+        excludeRequires 'java.compiler', 'java.rmi'
+        excludeUses 'org.apache.logging.log4j.message.ThreadDumpMessage.ThreadInfoFactory'
+        excludeProvides servicePattern: 'org.apache.logging.*'
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    mergedModule {
+        additive = true  // redundant, because excludeXXX() methods are also present
+        requires("java.desktop")
+        requiresTransitive("java.sql")
+        uses("java.sql.Driver")
+        provides("java.sql.Driver").with("org.hsqldb.jdbc.JDBCDriver")
+        excludeRequires("java.compiler", "java.rmi")
+        excludeUses("org.apache.logging.log4j.message.ThreadDumpMessage.ThreadInfoFactory")
+        excludeProvides(mapOf("servicePattern" to "org.apache.logging.*"))
+    }
+    ...
+}
+
+
+
+
+

launcher

+
+

The plugin generates script files for launching your application. +These script files can be customized by configuring the launcher block.

+
+
+

Environment variables can be included by using the Mustache syntax, +that is, by enclosing their name between {{ and }}. +Additionally, you can use the following placeholders:

+
+
+
    +
  • +

    {{BIN_DIR}} - the bin directory of the custom runtime image

    +
  • +
  • +

    {{HOME_DIR}} - user’s home directory ($HOME on Unix-like systems, %USERPROFILE% on Windows)

    +
    +
    +
    name
    +
    +

    The base name of the script files used to launch your application.
    +defaultValue: project.name

    +
    +
    jvmArgs
    +
    +

    list of JVM arguments to be passed to the java executable.
    +defaultValue: the arguments configured in the applicationDefaultJvmArgs property of the application extension

    +
    +
    args
    +
    +

    list of arguments to be passed to the application.
    +defaultValue: the arguments configured in the args property of the run task

    +
    +
    noConsole
    +
    +

    This boolean property has an effect only on Windows. It is ignored on other platforms.
    +If true, the application will be launched without an associated console window (using javaw instead of java).
    +defaultValue: false

    +
    +
    unixScriptTemplate
    +
    +

    the template for generating the script file for Unix-like systems.
    +defaultValue: null (the plugin uses its own template)

    +
    +
    windowsScriptTemplate
    +
    +

    the template for generating the script file for Windows-based systems.
    +defaultValue: null (the plugin uses its own template)

    +
    +
    +
    +
  • +
+
+
+

The plugin uses Groovy’s SimpleTemplateEngine +to parse the templates, with the following variables available:

+
+
+
    +
  • +

    moduleName

    +
  • +
  • +

    mainClassName

    +
  • +
  • +

    jvmArgs

    +
  • +
  • +

    args

    +
  • +
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    launcher {
+        name = 'my-app'
+        jvmArgs = [
+            '-Dlog4j.debug=true', '-Dlog4j.configurationFile={{BIN_DIR}}/log4j2.xml',
+            '-DdbHost', '{{PGHOST}}'
+        ]
+        args = ['--user', 'alice']
+        unixScriptTemplate = file('unixStartScript.txt')
+        windowsScriptTemplate = file('windowsStartScript.txt')
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    launcher {
+        name = "my-app"
+        jvmArgs = listOf(
+            "-Dlog4j.debug=true", "-Dlog4j.configurationFile={{BIN_DIR}}/log4j2.xml",
+            "-DdbHost", "{{PGHOST}}"
+        )
+        args = listOf("--user", "alice")
+        unixScriptTemplate = file("unixStartScript.txt")
+        windowsScriptTemplate = file("windowsStartScript.txt")
+    }
+    ...
+}
+
+
+
+
+

secondaryLauncher

+
+

The plugin can generate script files for additional applications besides the main one. +For each additional application you configure a secondaryLauncher block. +This block supports all properties of the launcher block and also the following ones:

+
+
+
+
mainClass
+
+

the main class of this additional application.

+
+
moduleName
+
+

the module containing the main class of this additional application.
+defaultValue: the value of the moduleName property in the enclosing jlink extension

+
+
+
+
+

The following properties affect only the launchers produced by jpackage:

+
+
+
+
icon
+
+

the path to the icon used for this additional launcher.
+defaultValue: null (the icon of the main launcher is used)

+
+
winConsole
+
+

boolean value specifying whether Windows should start the application in a console window.
+defaultValue: null (the win-console settings of the main launcher are used)

+
+
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    secondaryLauncher {
+        name = 'my-additional-app'
+        mainClass = 'org.example.MyAdditionalApp'
+        args = ['--user', 'emma']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    launcher {
+        name = "my-additional-app"
+        mainClass = "org.example.MyAdditionalApp"
+        args = listOf("--user", "emma")
+    }
+    ...
+}
+
+
+
+
+

customImage

+
+

By default, all application modules are included in the custom runtime image. +This block allows you to create a custom runtime image containing only some of the application modules.

+
+
+

If the customImage block is empty, the plugin will create a JRE containing only the JDK modules required by your application. +The plugin figures out by itself which JDK modules are needed, but you can use the below property to request a different set of modules.

+
+
+
+
jdkModules
+
+

list of JDK modules to be included in the generated image.
+defaultValue: null (the plugin figures out by itself which JDK modules are needed)

+
+
jdkAdditive
+
+

if true, the custom image will contain both the modules in the jdkModules list and the JDK modules identified as required by the plugin itself. +defaultValue: false

+
+
appModules
+
+

list of application modules to be included in the generated image.
+Modules required by those in this list will be automatically included.
+defaultValue: null (no application modules are included)

+
+
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    mergedModuleName = 'my.merged.module'
+    customImage {
+        jdkModules = ['java.desktop', 'java.xml', 'jdk.unsupported']
+        appModules = ['my.merged.module']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    mergedModuleName = "my.merged.module"
+    customImage {
+        jdkModules = listOf("java.desktop", "java.xml", "jdk.unsupported")
+        appModules = listOf("my.merged.module")
+    }
+    ...
+}
+
+
+
+
+

jpackage

+
+

This script block allows you to customize the jpackage-based generation of platform-specific application images and installers.

+
+
+
+
jpackageHome
+
+

The path to the JDK providing the jpackage tool.
+defaultValue: the first non-empty value from:
+      - the badass.jlink.jpackage.home system property
+      - the BADASS_JLINK_JPACKAGE_HOME environment variable
+      - the Java toolchain configured in the Gradle script
+      - the java.home system property (only if it points to a JRE containing the jpackage tool)
+      - the JAVA_HOME environment variable
+usage example: jpackageHome = "/usr/lib/jvm/jdk16"

+
+
outputDir
+
+

Convenience property for setting both imageOutputDir and +installerOutputDir with the value buildDir/outputDir.
+ defaultValue: "jpackage"
+ usage example: outputDir = "my-packaging"

+
+
imageOutputDir
+
+

the directory passed as argument to the --output option of jpackage when executing the jpackageImage task . +defaultValue: buildDir/outputDir
+usage example: imageOutputDir = file("$buildDir/my-packaging-image")

+
+
imageName
+
+

the argument passed to the --name option when executing the jpackageImage task.
+defaultValue: the name value configured in the launcher block or project.name
+usage example: imageName = "MyApp"
+It’s recommended to use the same value as for the installerName property.

+
+
imageOptions
+
+

list of additional options to be passed to the jpackage executable when executing the jpackageImage task.
+defaultValue: empty list
+usage example: imageOptions = ["--win-console"]

+
+
resourceDir
+
+

the directory passed as argument to the --resource-dir option when running jpackage to create an application installer. +It is also applicable when creating an application image when you want your own application image instead of the default java image.
+ usage example: resourceDir = file("$buildDir/my-packaging-resources")

+
+
skipInstaller
+
+

boolean value that lets you generate only the platform-specific application image and skip the generation of the platform-specific application installer.
+defaultValue: false
+usage example: skipInstaller = true

+
+
installerType
+
+

the type of installer to be generated.
+defaultValue: null (all supported types for the current platform will be generated)
+usage example: installerType = "rpm"

+
+
installerOutputDir
+
+

the directory passed as argument to the --output option when running jpackage when executing the jpackage task. +defaultValue: buildDir/outputDir
+usage example: installerOutputDir = file("$buildDir/my-packaging-installer")

+
+
installerName
+
+

the argument passed to the --name option when running jpackage when executing the jpackage task.
+defaultValue: the name value configured in the launcher block or project.name
+usage example: installerName = "MyApp"
+It’s recommended to use the same value as for the imageName property.

+
+
appVersion
+
+

the argument passed to the --app-version option when running jpackage when executing the jpackage and jpackageImage tasks.
+defaultValue: the project version
+usage example: appVersion = "1.0.0"

+
+
icon
+
+

the path to the custom application icon.
+This is a convenience property equivalent to configuring --icon in the imageOptions list.
+defaultValue: null (the default icon is used)

+
+
vendor
+
+

the vendor name.
+This is a convenience property equivalent to configuring --vendor in the imageOptions list.
+defaultValue: Unknown

+
+
jvmArgs
+
+

list of JVM arguments to be passed to the virtual machine.
+defaultValue: the jvmArgs value configured in the launcher block, or the arguments configured in the applicationDefaultJvmArgs property of the application extension

+
+
args
+
+

list of arguments to be passed to the application.
+defaultValue: the args value configured in the launcher block, or the arguments configured in the args property of the run task

+
+
+
+
+

NOTE: If args or jvmArgs is not set, and the default value is taken from the launcher block, it may contain the placeholder {{BIN_DIR}}. +The plugin replaces this placeholder with $APPDIR/.. when passing the arguments to jpackage. +This is the correct approach in most cases. If not, you need to explicitly configure args or jvmArgs in the jpackage block.
+Currently, jpackage doesn’t support environment variables in --java-options. +Therefore, you cannot use environment variable names enclosed between {{ and }} in jvmArgs.

+
+
+
+
installerOptions
+
+

list of additional options to be passed to the jpackage executable when executing the jpackage task.
+defaultValue: empty list
+usage example: installerOptions = ["--win-console"]

+
+
targetPlatformName
+
+

This property is required only when using the targetPlatform method. +It specifies which of the images produced by jlink should be used as runtime image by jpackage. +Its value must match the name provided in one of the calls to the targetPlatform method.
+defaultValue: null
+usage example: targetPlatformName = "linux"

+
+
+
+
+ + + + + +
+ + +In contrast to jlink, jpackage is not able to produce installers for other platforms. +For example, to create an installer for Linux, you must run jpackage on a Linux machine. +You cannot do it on a Windows or Mac platform. +
+
+
+ + + + + +
+ + +If you need to create installers for more than one platform, it’s probably better not to use targetPlatform. +Instead, you run the same build on different machines. +If your project is on GitHub, you can automate this by using GitHub Actions, as seen in this example. +
+
+
+

Usage example

+
+
+
Groovy
+
+
jlink {
+    ...
+    jpackage {
+        jpackageHome = '/usr/lib/jvm/jdk16'
+        outputDir = 'my-packaging'
+        // imageOutputDir = file("$buildDir/my-packaging-image")
+        // installerOutputDir = file("$buildDir/my-packaging-installer")
+        imageName = 'MyApp'
+        imageOptions = ['--win-console']
+        skipInstaller = false
+        installerName = 'MyApp'
+        installerType = 'msi'
+        installerOptions = ['--win-console', '--win-menu', '--win-shortcut']
+    }
+    ...
+}
+
+
+
+
Kotlin
+
+
jlink {
+    ...
+    jpackage {
+        jpackageHome = "/usr/lib/jvm/jdk16"
+        outputDir = "my-packaging"
+        // imageOutputDir = file("$buildDir/my-packaging-image")
+        // installerOutputDir = file("$buildDir/my-packaging-installer")
+        imageName = "MyApp"
+        imageOptions = listOf("--win-console")
+        skipInstaller = false
+        installerName = "MyApp"
+        installerType = "msi"
+        installerOptions = listOf("--win-console", "--win-menu", "--win-shortcut")
+    }
+    ...
+}
+
+
+
+
+
+

How it works

+
+

The plugin combines all non-modular dependencies into a single jar to which it adds a module descriptor. +If the jlink extension contains a mergedModule block, its directives will be used to generate the module descriptor. +Otherwise, a module descriptor is created using the algorithm implemented by the suggestMergedModuleInfo task. +If the attribute additive is set to true in the mergedModule block, the generated module descriptor adds the clauses +specified in this block to the "suggested" descriptor.

+
+
+

The non-modular dependencies appear as automatic modules in the original module graph. +The plugin replaces them with delegating modules, which are dummy modules containing only a module descriptor that +requires transitive the merged module.

+
+
+

The figure below illustrates this process.

+
+
+
+merging +
+
+
+

In some situations, the above approach would lead to cyclic dependencies between modules. +For example, in the module graph below the automatic module org.example.mod1 requires the proper module org.example.mod2. +Because the content of org.example.mod1 gets merged into the merged module, the merged module must require org.example.mod2. +This in turn requires the delegating module org.example.mod3 and hence the merged module.

+
+
+
+merging.cycle +
+
+
+

To prevent such problems, the plugin automatically detects the modular jars that would be involved in a cycle and treats them +as if they were non-modular. +This means that it also merges these modular jars into the merged module and replaces them with delegating modules. +The figure below shows the resulting module graph.

+
+
+
+merging.no cycle +
+
+
+

Sometimes, you may want to have a modular jar treated as non-modular, even if it is not affected by a cyclic dependency problem. +You can do this using the forceMerge method.

+
+
+
+

Task details

+
+

The following properties denote files and directories used by the plugin tasks:

+
+
+
    +
  • +

    imageDir - the directory into which the custom runtime image should be generated.

    +
  • +
  • +

    imageZip - the file into which a zip archive of the custom runtime image should be created.

    +
  • +
  • +

    jlinkBasePath - the path to the base working directory of the plugin. +The table below shows the variable names of the subdirectories created here and their relative path to the base working directory:

    +
  • +
+
+
+

+

+ ++++ + + + + + + + +
Variable namePath relative to jlinkBasePath
mergedJarsDirmergedjars
tmpMergedModuleDirtmpmerged
jlinkJarsDirjlinkjars
tmpjars
tmpModuleInfoDirtmpmodinfo
delegatingModulesDirdelegating
+
+

+
+
+

prepareMergedJarsDir

+
+
+
- clean jlinkBasePath
+- copy modular jars required by non-modular jars to jlinkJarsDir
+- copy non-modular jars to nonModularJarsDir
+- unpack all jars from nonModularJarsDir into mergedJarsDir
+- create MANIFEST.MF in mergedJarsDir
+
+
+
+
+

createMergedModule

+
+
+
- archive mergedJarsDir into tmpMergedModuleDir/mergedModuleName.jar
+- generate module-info.java for the above merged jar into tmpJarsDir
+- clean tmpModuleInfoDir and unpack the merged jar in it
+- compile the generated module-info.java into tmpModuleInfoDir
+        using jlinkJarsDir as module-path
+- copy mergedJarsDir into tmpModuleInfoDir
+- re-create tmpMergedModuleDir/mergedModuleName.jar by archiving tmpModuleInfoDir
+
+
+
+
+

createDelegatingModules

+
+
+
- delete tmpJarsDir
+- for each file in nonModularJarsDir:
+    - create delegating module-info.java into tmpJarsDir/<current-module-name>
+    - clean tmpModuleInfoDir and create MANIFEST.MF in it
+    - compile module-info.java into
+            tmpModuleInfoDir with jlinkJarsDir as module-path
+    - create a jar of tmpModuleInfoDir into delegatingModulesDir
+
+
+
+
+

prepareModulesDir

+
+
+
- copy delegating modules from delegatingModulesDir to jlinkJarsDir
+- copy modular jars not required by non-modular jars to jlinkJarsDir
+- copy the main module jar from project.jar.archivePath to jlinkJarsDir
+- adjust all module descriptors containing qualified exports or opens clauses
+        referring to modules integrated in the merged module. These clauses
+        will be changed to also refer to the merged module.
+
+
+
+
+ +
+
+
- delete imageDir
+- create custom runtime image in imageDir by executing jlink
+        with modules from jlinkJarsDir
+
+
+
+
+

jlinkZip

+
+
+
- zip imageDir to imageZip
+
+
+
+
+

suggestMergedModuleInfo

+
+
+
- determine the modules required by the merged module
+- determine the services used by the merged module
+- determine the services provided by the merged module
+- print the suggested `mergedModule` block
+
+
+
+
+
Options
+
language
+
+

the DSL for which the mergedModule block should be displayed.
+default value: groovy
+accepted values: groovy, kotlin, java
+usage example: ./gradlew suggestMergedModuleInfo --language=kotlin

+
+
+
+
+
+

jpackageImage

+
+
+
- create a platform-specific application image in imageOutputDir by executing:
+        jpackage --type app-image --runtime-image imageDir --module-path jlinkJarsDir ...
+
+
+
+

The properties imageOutputDir and imageDir +can be configured in the jpackage script block.

+
+
+
+

jpackage

+
+
+
- if skipInstaller is false:
+        create a platform-specific application installer in installerOutputDir by executing:
+        jpackage --type installerType --app-image=imageOutputDir/imageName ...
+
+
+
+

The properties installerOutputDir, installerType, imageOutputDir, and imageName +can be configured in the jpackage script block.

+
+
+

If no installerType has been configured, the plugin will run jpackage several times, one for each type supported by the current platform.

+
+
+
+
+
+
+

Examples

+
+
+

The following projects illustrate how to use this plugin to create custom runtime images:

+
+
+ +
+
+
+
+ + + + \ No newline at end of file