| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <meta name="generator" content="Asciidoctor 2.0.10"> |
| <title>Apache OFBiz®</title> |
| <link rel="stylesheet" href="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"> |
| <style> |
| /* 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}} |
| </style> |
| </head> |
| <body id="apache-ofbiz" class="article"> |
| <div id="header"> |
| <h1>Apache OFBiz®</h1> |
| </div> |
| <div id="content"> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p><span class="image"><a class="image" href="http://www.apache.org/licenses/LICENSE-2.0"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License Apache%202.0 blue"></a></span></p> |
| </div> |
| <div class="paragraph"> |
| <p>If you are reading this file in AsciiDoc format you may want to see it in |
| <a href="https://ci.apache.org/projects/ofbiz/site/trunk/readme/html5/README.html">HTML</a><br> |
| or <a href="https://ci.apache.org/projects/ofbiz/site/trunk/readme/pdf/README.pdf">PDF</a> format</p> |
| </div> |
| <hr> |
| <div class="paragraph"> |
| <p>Welcome to <strong>Apache OFBiz</strong>! A powerful top level Apache software project. OFBiz |
| is an Enterprise Resource Planning (ERP) System written in Java and houses a |
| large set of libraries, entities, services and features to run all aspects of |
| your business.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For more details about OFBiz please visit the OFBiz Documentation page:</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="http://ofbiz.apache.org/documentation.html">OFBiz documentation</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="http://www.apache.org/licenses/LICENSE-2.0">OFBiz License</a></p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: If you want to use Eclipse, read the "Setup eclipse project for OFBiz" |
| section to set it up.</p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: If you want to use an external database like MySQL or PostgreSQL, read |
| the "Setup an external database" section to set it up.</p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: If you want to run OFBiz without an internet connection, read the |
| "Running gradle tasks without an internet connection" section.</p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: The directory structure and repositories have changed. For more |
| information read the "Repository and directory structure" section.</p> |
| </div> |
| </blockquote> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="system-requirements">System requirements</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The only requirement to run OFBiz is to have the Java Development Kit (JDK) |
| version 8 installed on your system (not just the JRE, but the full JDK) which |
| you can download from the below link. Make sure of setting the $JAVA_HOME |
| environment variable.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://adoptopenjdk.net/">JDK download</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://medium.com/@javachampions/java-is-still-free-2-0-0-6b9aa8d6d244">To know more about the JDK</a></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="quick-start">Quick start</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>To quickly install and fire-up OFBiz, please follow the below instructions from |
| the command line at the OFBiz top level directory (folder).</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="download-the-gradle-wrapper">Download the Gradle wrapper:</h3> |
| <div class="paragraph"> |
| <p>MS Windows: <code>init-gradle-wrapper</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>Unix-like OS: <code>./gradle/init-gradle-wrapper</code></p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="prepare-ofbiz">Prepare OFBiz:</h3> |
| <div class="sect3"> |
| <h4 id="_clean_system_and_load_the_complete_ofbiz_data">Clean system and load the complete OFBiz data</h4> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: Depending on your Internet connection speed it might take a long time |
| for this step to complete if you are using OFBiz for the first time as it needs |
| to download all dependencies. So please be patient!</p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="paragraph"> |
| <p>MS Windows: <code>gradlew cleanAll loadAll</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>Unix-like OS: <code>./gradlew cleanAll loadAll</code></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="start-ofbiz">Start OFBiz:</h3> |
| <div class="paragraph"> |
| <p>MS Windows: <code>gradlew ofbiz</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>Unix-like OS: <code>./gradlew ofbiz</code></p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: Ignore the % progress indicator because this task does not end as long |
| as OFBiz is running.</p> |
| </div> |
| </blockquote> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="visit-ofbiz-through-your-browser">Visit OFBiz through your browser:</h3> |
| <div class="paragraph"> |
| <p><a href="https://localhost:8443/ordermgr">Order Back Office</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://localhost:8443/accounting">Accounting Back Office</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://localhost:8443/webtools">Administrator interface</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>You can log in with the user <strong>admin</strong> and password <strong>ofbiz</strong>.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <div class="title">Note</div> |
| </td> |
| <td class="content"> |
| In case of problems visit our <a href="#further-reading">Further reading section</a>. |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="security">Security</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>If you find a security issue, please report it to: security @ ofbiz.apache.org. |
| Once proper mitigations to the security issues are complete the OFBiz team will |
| disclose this information to the public mailing list.</p> |
| </div> |
| <div class="paragraph"> |
| <p>You can find more information about security in OFBiz at |
| <a href="https://cwiki.apache.org/confluence/display/OFBIZ/Keeping+OFBiz+secure">Keeping |
| OFBiz secure</a></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="build-system-syntax">Build system syntax</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>All build tasks are executed using the <strong>Gradle</strong> build system which is embedded |
| in OFBiz. To execute build tasks go to OFBiz top-level directory (folder) and |
| execute tasks from there.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="operating-system-syntax">Operating System Syntax</h3> |
| <div class="paragraph"> |
| <p>The syntax for tasks differ slightly between windows and Unix-like systems</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Windows</strong>: <code>gradlew <tasks-in-here></code></p> |
| </li> |
| <li> |
| <p><strong>Unix-like</strong>: <code>./gradlew <tasks-in-here></code></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For the rest of this document, we will use the windows syntax, if you are on a |
| Unix-like system, you need to add the <code>./</code> to gradlew</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="types-of-tasks-in-gradle">Types of tasks in Gradle</h3> |
| <div class="paragraph"> |
| <p>There are two types of tasks designed for OFBiz in Gradle:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Standard tasks</strong>: To execute general standard Gradle tasks</p> |
| </li> |
| <li> |
| <p><strong>OFBiz server tasks</strong>: To execute OFBiz startup commands. These tasks start |
| with one of the following words:</p> |
| </li> |
| <li> |
| <p><strong>ofbiz</strong> : standard server commands</p> |
| </li> |
| <li> |
| <p><strong>ofbizBackground</strong> ; server commands running in a background forked process</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Tips:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>OFBiz <strong>server commands</strong> require <strong>"quoting"</strong> the commands. For example: |
| <code>gradlew "ofbiz --help"</code></p> |
| </li> |
| <li> |
| <p>Shortcuts to task names can be used by writing the first letter of every word |
| in a task name. However, you cannot use the shortcut form for OFBiz server |
| tasks. Example: <code>gradlew loadAdminUserLogin -PuserLoginId=myadmin</code> = |
| <code>gradlew lAUL -PuserLoginId=myadmin</code></p> |
| </li> |
| <li> |
| <p>Dependent tasks can be skipped with the -x switch. Example: |
| <code>gradlew build -x test</code> does not run the tests within the build.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect3"> |
| <h4 id="example-standard-tasks">Example standard tasks</h4> |
| <div class="paragraph"> |
| <p><code>gradlew build</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew cleanAll loadAll testIntegration</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="example-ofbiz-server-tasks">Example OFBiz server tasks</h4> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --help"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test" --debug-jvm</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbizBackground --start --portoffset 10000"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --shutdown --portoffset 10000"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew ofbiz</code> (default is --start)</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="example-mixed-tasks-standard-and-ofbiz-server">Example mixed tasks (standard and OFBiz server)</h4> |
| <div class="paragraph"> |
| <p><code>gradlew cleanAll loadAll "ofbiz --start --portoffset 10000"</code></p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="quick-reference">Quick reference</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>You can use the below common list of tasks as a quick reference for controlling |
| the system. This document uses the windows task syntax, if you are on a |
| Unix-like system, you need to add the <code>./</code> to gradlew i.e. <code>./gradlew</code></p> |
| </div> |
| <div class="sect2"> |
| <h3 id="help-tasks">Help tasks</h3> |
| <div class="sect3"> |
| <h4 id="list-ofbiz-server-commands">List OFBiz server commands</h4> |
| <div class="paragraph"> |
| <p>List all available commands to control the OFBiz server</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --help"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="list-build-tasks">List build tasks</h4> |
| <div class="paragraph"> |
| <p>List all available tasks from the build system</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew tasks</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="list-build-projects">List build projects</h4> |
| <div class="paragraph"> |
| <p>List all available projects in the build system</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew projects</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="gradle-build-system-help">Gradle build system help</h4> |
| <div class="paragraph"> |
| <p>Show usage and options for the Gradle build system</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew --help</code></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="server-command-tasks">Server command tasks</h3> |
| <div class="sect3"> |
| <h4 id="start-ofbiz-1">Start OFBiz</h4> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --start"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>start is the default server task so this also works:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew ofbiz</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="shutdown-ofbiz">Shutdown OFBiz</h4> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --shutdown"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="get-ofbiz-status">Get OFBiz status</h4> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --status"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="force-ofbiz-shutdown">Force OFBiz shutdown</h4> |
| <div class="paragraph"> |
| <p>Terminate all running OFBiz server instances by calling the appropriate |
| operating system kill command. Use this command to force OFBiz termination if |
| the --shutdown command does not work. Usually this is needed when in the middle |
| of data loading or testing in OFBiz.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Warning: Be careful in using this command as force termination might lead to |
| inconsistent state / data</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew terminateOfbiz</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="start-ofbiz-in-remote-debug-mode">Start OFBiz in remote debug mode</h4> |
| <div class="paragraph"> |
| <p>Starts OFBiz in remote debug mode and waits for debugger or IDEs to connect on |
| port <strong>5005</strong></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew ofbiz --debug-jvm</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="start-ofbiz-on-a-different-port">Start OFBiz on a different port</h4> |
| <div class="paragraph"> |
| <p>Start OFBiz of the network port offsetted by the range provided in the argument |
| to --portoffset</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --start --portoffset 10000"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="start-ofbiz-in-the-background">Start OFBiz in the background</h4> |
| <div class="paragraph"> |
| <p>Start OFBiz in the background by forking it to a new process and redirecting the |
| output to <strong>runtime/logs/console.log</strong></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbizBackground --start"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>OR</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew ofbizBackground</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>You can also offset the port, for example:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbizBackground --start --portoffset 10000"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="passing-jvm-runtime-options-to-ofbiz">Passing JVM runtime options to OFBiz</h4> |
| <div class="paragraph"> |
| <p>You can pass JVM runtime options by specifying the project property <code>-PjvmArgs</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew ofbiz -PjvmArgs="-Xms1024M -Xmx2048M" -Dsome.parameter=hello</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>If you do not specify <code>jvmArgs</code>, a default of <code>-Xms128M -Xmx1024M</code> is set.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="data-loading-tasks">Data loading tasks</h3> |
| <div class="paragraph"> |
| <p>OFBiz contains the following data reader types:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>seed</strong>: OFBiz and External Seed Data - to be maintained along with source and |
| updated whenever a system deployment is updated</p> |
| </li> |
| <li> |
| <p><strong>seed-initial</strong>: OFBiz and External Seed Data - to be maintained along with |
| source like other seed data, but only loaded initially and not updated when a |
| system is updated except manually reviewing each line</p> |
| </li> |
| <li> |
| <p><strong>demo</strong>: OFBiz Only Demo Data</p> |
| </li> |
| <li> |
| <p><strong>ext</strong>: External General Data (custom)</p> |
| </li> |
| <li> |
| <p><strong>ext-test</strong>: External Test Data (custom)</p> |
| </li> |
| <li> |
| <p><strong>ext-demo</strong>: External Demo Data (custom)</p> |
| </li> |
| <li> |
| <p><strong>tenant</strong>: Data to load into the master tenants database "ofbiztenant". This |
| data is required to identify where a tenant’s database is located. For more |
| information you can review the relevant |
| <a href="https://cwiki.apache.org/confluence/display/OFBIZ/Multitenancy+support">tenant |
| documentation</a></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Available options for the --load-data server command are the following:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>readers=[name]</strong>: only load data from certain readers separated by comma. e.g. |
| seed,seed-initial,ext</p> |
| </li> |
| <li> |
| <p><strong>file=[path]</strong>: load a single file from location or several files separated by |
| commas. e.g. /my/file/1,/my/file/2</p> |
| </li> |
| <li> |
| <p><strong>dir=[path]</strong>: load all data files found in directory</p> |
| </li> |
| <li> |
| <p><strong>component=[name]</strong>: only load data from a specific component. e.g. base</p> |
| </li> |
| <li> |
| <p><strong>delegator=[name]</strong>: use the defined delegator. Default is "default". If the |
| value passed is <strong>"all-tenants"</strong> then OFBiz will load the data for all defined |
| tenants in the system.</p> |
| </li> |
| <li> |
| <p><strong>group=[name]</strong>: override the entity group (org.apache.ofbiz). e.g. |
| com.example.something</p> |
| </li> |
| <li> |
| <p><strong>timeout=[millis]</strong>: timeout in milliseconds</p> |
| </li> |
| <li> |
| <p><strong>create-pks</strong>: create primary keys</p> |
| </li> |
| <li> |
| <p><strong>drop-pks</strong>: drop primary keys</p> |
| </li> |
| <li> |
| <p><strong>create-constraints</strong>: create indexes and foreign keys after loading</p> |
| </li> |
| <li> |
| <p><strong>drop-constraints</strong>: drop indexes and foreign keys before loading</p> |
| </li> |
| <li> |
| <p><strong>create-fks</strong>: create dummy (placeholder) foreign keys</p> |
| </li> |
| <li> |
| <p><strong>maintain-txs</strong>: maintain timestamps in data file</p> |
| </li> |
| <li> |
| <p><strong>try-inserts</strong>: use mostly inserts</p> |
| </li> |
| <li> |
| <p><strong>repair-columns</strong>: repair column sizes (default is true w/ drop-constraints)</p> |
| </li> |
| <li> |
| <p><strong>continue-on-failure</strong>: By default OFBiz will fail and stop if it is unable to |
| load any of the files it is attempting to load. By passing this property OFBiz |
| will ignore failures and continue loading all files</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-specific-ofbiz-data">Load specific OFBiz data</h4> |
| <div class="paragraph"> |
| <p>you can choose which data readers to pass in the following syntax:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data readers=<readers-here-comma-separated>"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>Example:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data readers=seed,seed-initial,ext,ext-demo"</code></p> |
| </div> |
| <div class="literalblock"> |
| <div class="content"> |
| <pre> Beware that copying this command in Microsoft Word will automatically transform |
| the double dash in en dashes (Unicode 0x2013: –) Other cases not related to Word |
| were also reported.So when this command does not work check that you are using |
| dash! text</pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-all-ofbiz-data">Load all OFBiz data</h4> |
| <div class="paragraph"> |
| <p>Loads all data sets; meant for initial loading of generic OFBiz data. Can be |
| applied for development, testing, demonstration, etc. purposes. Be aware that |
| executing this task can result in your data being overwritten in your database |
| of choice. Use with caution in production environments.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew loadAll</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>OR</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-seed-data">Load seed data</h4> |
| <div class="paragraph"> |
| <p>Load ONLY the seed data (not seed-initial, demo, ext* or anything else); meant |
| for use after an update of the code to reload the seed data as it is generally |
| maintained along with the code and needs to be in sync for operation</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data readers=seed"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-ext-data">load ext data</h4> |
| <div class="paragraph"> |
| <p>Load seed, seed-initial and ext data; meant for manual/generic testing, |
| development, or going into production with a derived system based on stock OFBiz |
| where the ext data basically replaces the demo data</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data readers=seed,seed-initial,ext"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-ext-test-data">load ext test data</h4> |
| <div class="paragraph"> |
| <p>Load seed, seed-initial, ext and ext-test data; meant for automated testing with |
| a derived system based on stock OFBiz</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data readers=seed,seed-initial,ext,ext-test"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-data-from-an-entity-file">load data from an entity file</h4> |
| <div class="paragraph"> |
| <p>Load data from an XML file holding entity data.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --load-data file=foo/bar/FileNameHere.xml"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="create-a-new-tenant">create a new tenant</h4> |
| <div class="paragraph"> |
| <p>Create a new tenant in your environment, create the delegator, load initial data |
| with admin-user and password (needs multitenant=Y in general.properties). The |
| following project parameters are passed:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>tenantId: mandatory</p> |
| </li> |
| <li> |
| <p>tenantName: optional, default is value of tenantId</p> |
| </li> |
| <li> |
| <p>domainName: optional, default is org.apache.ofbiz</p> |
| </li> |
| <li> |
| <p>tenantReaders: optional, default value is seed,seed-initial,demo</p> |
| </li> |
| <li> |
| <p>dbPlatform: optional, D(Derby), M(MySQL), O(Oracle), P(PostgreSQL) (default D)</p> |
| </li> |
| <li> |
| <p>dbIp: optional, ip address of the database</p> |
| </li> |
| <li> |
| <p>dbUser: optional, username of the database</p> |
| </li> |
| <li> |
| <p>dbPassword: optional, password of the database</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew createTenant -PtenantId=mytenant</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew createTenant -PtenantId=mytenant -PtenantName="My Name" -PdomainName=com.example -PtenantReaders=seed,seed-initial,ext -PdbPlatform=M -PdbIp=127.0.0.1 -PdbUser=mydbuser -PdbPassword=mydbpass</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>If run successfully, the system creates a new tenant having:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>delegator: default#${tenandId} (e.g. default#mytenant)</p> |
| </li> |
| <li> |
| <p>admin user: ${tenantId}-admin (e.g. mytenant-admin)</p> |
| </li> |
| <li> |
| <p>admin user password: ofbiz</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="load-data-for-a-specific-tenant">load data for a specific tenant</h4> |
| <div class="paragraph"> |
| <p>Load data for one specific tenant in a multitenant environment. Note that you |
| must set multitenant=Y in general.properties and the following project |
| parameters are passed:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>tenantId (mandatory)</p> |
| </li> |
| <li> |
| <p>tenantReaders (optional)</p> |
| </li> |
| <li> |
| <p>tenantComponent (optional)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew loadTenant -PtenantId=mytenant</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew loadTenant -PtenantId=mytenant -PtenantReaders=seed,seed-initial,demo -PtenantComponent=base</code></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="testing-tasks">Testing tasks</h3> |
| |
| </div> |
| </div> |
| </div> |
| <h1 id="_tagtestingtasks" class="sect0">tag::testingtasks[]</h1> |
| <div class="sect3"> |
| <h4 id="execute-all-unit-tests">Execute all unit tests</h4> |
| <div class="paragraph"> |
| <p><code>gradlew test</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-all-integration-tests">Execute all integration tests</h4> |
| <div class="paragraph"> |
| <p><code>gradlew testIntegration</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>OR</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew 'ofbiz --test'</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-integration-tests-with-a-different-log-level">Execute integration tests with a different log level</h4> |
| <div class="paragraph"> |
| <p>It is possible to start integration tests with a log level different from the |
| default one. The log levels allowed are listed below from most verbose to least |
| verbose:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>always</p> |
| </li> |
| <li> |
| <p>verbose</p> |
| </li> |
| <li> |
| <p>timing</p> |
| </li> |
| <li> |
| <p>info</p> |
| </li> |
| <li> |
| <p>important</p> |
| </li> |
| <li> |
| <p>warning</p> |
| </li> |
| <li> |
| <p>error</p> |
| </li> |
| <li> |
| <p>fatal</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test loglevel=fatal"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-an-integration-test-case">Execute an integration test case</h4> |
| <div class="paragraph"> |
| <p>run a test case, in this example the component is "entity" and the case name is |
| "entity-tests"</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test component=entity --test suitename=entitytests --test case=entity-query-tests"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-an-integration-test-case-in-debug-mode-with-verbose-log">Execute an integration test case in debug mode with verbose log</h4> |
| <div class="paragraph"> |
| <p>listens on port <strong>5005</strong></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test component=entity --test loglevel=verbose" --debug-jvm</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-an-integration-test-suite">Execute an integration test suite</h4> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test component=entity --test suitename=entitytests"</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execute-an-integration-test-suite-in-debug-mode">Execute an integration test suite in debug mode</h4> |
| <div class="paragraph"> |
| <p>listens on port <strong>5005</strong></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew "ofbiz --test component=entity --test suitename=entitytests" --debug-jvm</code></p> |
| </div> |
| </div> |
| <h1 id="_endtestingtasks" class="sect0">end::testingtasks[]</h1> |
| <div class="sect2"> |
| <h3 id="miscellaneous-tasks">Miscellaneous tasks</h3> |
| <div class="sect3"> |
| <h4 id="run-all-tests-on-a-clean-system">Run all tests on a clean system</h4> |
| <div class="paragraph"> |
| <p><code>gradlew cleanAll loadAll testIntegration</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="clean-all-generated-artifacts">Clean all generated artifacts</h4> |
| <div class="paragraph"> |
| <p><code>gradlew cleanAll</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="refresh-the-generated-artifacts">Refresh the generated artifacts</h4> |
| <div class="paragraph"> |
| <p><code>gradlew clean build</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="create-an-admin-user-account">Create an admin user account</h4> |
| <div class="paragraph"> |
| <p>Create an admin user with login name MyUserName and default password with value |
| "ofbiz". Upon first login OFBiz will request changing the default password</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew loadAdminUserLogin -PuserLoginId=MyUserName</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="compile-java-without-using-xlint-output">Compile Java without using Xlint output</h4> |
| <div class="paragraph"> |
| <p>By default Xlint prints output of all warnings detected by the compiler, if you |
| want to silence them</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew -PXlint:none build</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="run-owasp-tool-to-identify-dependency-vulnerabilities-cves">Run OWASP tool to identify dependency vulnerabilities (CVEs)</h4> |
| <div class="paragraph"> |
| <p>The below command activates a gradle plugin (OWASP) and Identifies and reports |
| known vulnerabilities (CVEs) in OFBiz library dependencies. The task takes time |
| to complete, and once done, a report will be generated in |
| $OFBIZ_HOME/build/reports/dependency-check-report.html</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew -PenableOwasp dependencyCheckAnalyze</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="setup-eclipse-project-for-ofbiz">Setup eclipse project for OFBiz</h4> |
| <div class="paragraph"> |
| <p>Setting up OFBiz on eclipse is done by simply running the below command and then |
| importing the project to eclipse. This command will generate the necessary |
| <strong>.classpath</strong> and <strong>.project</strong> files for eclipse and it will also make the source |
| code for external libraries available in eclipse (i.e. you can view source |
| through Ctrl + Click)</p> |
| </div> |
| <div class="paragraph"> |
| <p>The first time you run this command it will take a long time to execute because |
| it will download source packages available for project dependencies.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew eclipse</code></p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="package-and-distribute-ofbiz">Package and distribute OFBiz</h4> |
| <div class="paragraph"> |
| <p>In order to deploy OFBiz on a target system and in particular in a production |
| environment without requiring the target system to download Gradle and OFBiz |
| dependencies from the internet, it is possible to generate an archive bundling |
| OFBiz with all the Jars it depends on as a <code>tar</code> archive</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew distTar</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>or as a <code>zip</code> archive.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew distZip</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>Those archives are available in the <code>build/distributions</code> directory. To run |
| OFBiz from those archive you must first unarchive them with <code>tar xf</code> or <code>unzip</code> |
| and then from that directory you can run either <code>bin/ofbiz</code> shell script or |
| <code>bin/ofbiz.bat</code> batch script with the appropriate ofbiz options.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="ofbiz-plugin-system">OFBiz plugin system</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>OFBiz provides an extension mechanism through plugins. Plugins are standard |
| OFBiz components that reside in the plugins directory. Plugins can be added |
| manually or fetched from a maven repository. The standard tasks for managing |
| plugins are listed below.</p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: OFBiz plugin versions follow <a href="http://semver.org/">Semantic Versioning |
| 2.0.0</a></p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="sect2"> |
| <h3 id="pull-download-and-install-a-plugin-automatically">Pull (download and install) a plugin automatically</h3> |
| <div class="paragraph"> |
| <p>Download a plugin with all its dependencies (plugins) and install them |
| one-by-one starting with the dependencies and ending with the plugin itself.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pullPlugin -PdependencyId="org.apache.ofbiz.plugin:myplugin:0.1.0"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>If the plugin resides in a custom maven repository (not jcenter or localhost) |
| then you can use specify the repository using below command:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pullPlugin -PrepoUrl="http://www.example.com/custom-maven" -PdependencyId="org.apache.ofbiz.plugin:myplugin:0.1.0"</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>If you need username and password to access the custom repository:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pullPlugin -PrepoUrl="http://www.example.com/custom-maven" -PrepoUser=myuser -PrepoPassword=mypassword -PdependencyId="org.apache.ofbiz.plugin:myplugin:0.1.0"</code></p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="pull-an-official-plugin-from-source-control">Pull an official plugin from source control</h3> |
| <div class="paragraph"> |
| <p>Download an official plugin from source control (currently subversion) and place |
| it in the plugins directory. In addition, this task also executes the "install" |
| task if it is defined for the plugin being downloaded.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This task is mostly useful when working on the trunk branch as it pulls in the |
| latest version of a plugin.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pullPluginSource -PpluginId=ecommerce</code></p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: This plugin will have its own .svn directory placed inside the plugin |
| directory.</p> |
| </div> |
| </blockquote> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="pull-all-official-plugins-from-source-control">Pull all official plugins from source control</h3> |
| <div class="paragraph"> |
| <p>Download all officially supported plugins from source control (currently |
| subversion) and place them inclusive of their ".svn" directory in /plugins. |
| WARNING! This task deletes the /plugins directory and replaces it with the |
| official plugins.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pullAllPluginsSource</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>This task makes it easy to download and develop officially supported plugins. It |
| is mostly used by developers or individuals working on the trunk branch. We do |
| not recommend using this task on releases of OFBiz, instead consider using the |
| "pullPlugin" task to get the correct version of a plugin compatible with your |
| release.</p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p><em>Note</em>: All the plugins will share a .svn directory placed in the plugins |
| directory.</p> |
| </div> |
| </blockquote> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="install-a-plugin">Install a plugin</h3> |
| <div class="paragraph"> |
| <p>If you have a plugin called mycustomplugin and want to install it in OFBiz |
| follow the below instructions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Extract the plugin if it is compressed</p> |
| </li> |
| <li> |
| <p>Place the extracted directory into /plugins</p> |
| </li> |
| <li> |
| <p>Run the below command</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew installPlugin -PpluginId=myplugin</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>The above commands executes the task "install" in the plugin’s build.gradle file |
| if it exists</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="uninstall-a-plugin">Uninstall a plugin</h3> |
| <div class="paragraph"> |
| <p>If you have an existing plugin called mycustomplugin and you wish to uninstall |
| run the below command</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew uninstallPlugin -PpluginId=myplugin</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>The above command executes the task "uninstall" in the plugin’s build.gradle |
| file if it exists</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="remove-a-plugin">Remove a plugin</h3> |
| <div class="paragraph"> |
| <p>Calls <strong>uninstallPlugin</strong> on an existing plugin and then delete it from the |
| file-system</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew removePlugin -PpluginId=myplugin</code></p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="create-a-new-plugin">Create a new plugin</h3> |
| <div class="paragraph"> |
| <p>Create a new plugin. The following project parameters are passed:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>pluginId: mandatory</p> |
| </li> |
| <li> |
| <p>pluginResourceName: optional, default is the Capitalized value of pluginId</p> |
| </li> |
| <li> |
| <p>webappName: optional, default is the value of pluginId</p> |
| </li> |
| <li> |
| <p>basePermission: optional, default is the UPPERCASE value of pluginId</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew createPlugin -PpluginId=myplugin</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew createPlugin -PpluginId=myplugin -PpluginResourceName=MyPlugin -PwebappName=mypluginweb -PbasePermission=MYSECURITY</code></p> |
| </div> |
| <div class="paragraph"> |
| <p>The above command creates a new plugin in /plugins/myplugin</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="push-a-plugin-to-a-repository">Push a plugin to a repository</h3> |
| <div class="paragraph"> |
| <p>This task publishes an OFBiz plugin into a maven package and then uploads it to |
| a maven repository. Currently, pushing is limited to localhost maven repository |
| (work in progress). To push a plugin the following parameters are passed:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>pluginId: mandatory</p> |
| </li> |
| <li> |
| <p>groupId: optional, defaults to org.apache.ofbiz.plugin</p> |
| </li> |
| <li> |
| <p>pluginVersion: optional, defaults to 0.1.0-SNAPSHOT</p> |
| </li> |
| <li> |
| <p>pluginDescription: optional, defaults to "Publication of OFBiz plugin |
| ${pluginId}"</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pushPlugin -PpluginId=myplugin</code></p> |
| </div> |
| <div class="paragraph"> |
| <p><code>gradlew pushPlugin -PpluginId=mycompany -PpluginGroup=com.mycompany.ofbiz.plugin -PpluginVersion=1.2.3 -PpluginDescription="Introduce special functionality X"</code></p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="miscellaneous-documentation">Miscellaneous Documentation</h2> |
| <div class="sectionbody"> |
| <div class="sect2"> |
| <h3 id="further-reading">Further reading</h3> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="https://cwiki.apache.org/confluence/display/OFBIZ/FAQ%2B-%2BTips%2B-%2BTricks%2B-%2BCookbook%2B-%2BHowTo#FAQ-Tips-Tricks-Cookbook-HowTo-Knownissues">Known |
| issues</a></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="repository-and-directory-structure">Repository and directory structure</h3> |
| <div class="paragraph"> |
| <p>OFBiz is split into two repositories:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>ofbiz-framework</strong>: Contains the core framework and main applications in the |
| system like accounting, party, order, etc</p> |
| </li> |
| <li> |
| <p><strong>ofbiz-plugins</strong>: Renamed from "special-purpose" and contains optional |
| components that are officially supported by the community</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Furthermore, the hot-deploy directory is removed as the plugins directory works |
| as a replacement for both "special-purpose" and "hot-deploy".</p> |
| </div> |
| <div class="paragraph"> |
| <p>If you need to load the components in the plugins directory in a specific order |
| place a component-load.xml file in the plugins directory listing the order.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To check out a plugin from source control use the <strong>pullPluginSource</strong> Gradle |
| task. To check out all plugins from source control use the |
| <strong>pullAllPluginsSource</strong>. <strong>Beware</strong> this deletes a previously existing plugins |
| directory.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="running-gradle-tasks-without-an-internet-connection">Running gradle tasks without an internet connection</h3> |
| <div class="paragraph"> |
| <p>OFBiz must run with an internet connection the <strong>first time</strong> it is prepared on |
| the system because it needs to download all the required dependencies.</p> |
| </div> |
| <div class="paragraph"> |
| <p>After preparing OFBiz the first time correctly, it is possible to run OFBiz |
| without an internet connection by using the <code>--offline</code> command line switch |
| which tells Gradle to fetch its dependencies from the cache.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If any dependencies are missing from the cache and you pass <code>--offline</code> switch |
| then the build execution will fail.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="setup-an-external-database-like-mysql-postgresql-etc">Setup an external database like MySQL, PostgreSQL, etc</h3> |
| <div class="paragraph"> |
| <p>To setup an external database instead of the default embedded Apache Derby, you |
| will need to follow the following instructions:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Find the JDBC driver suitable for your database using one of the following |
| options:</p> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Search for the JDBC driver in <a href="https://bintray.com/bintray/jcenter">jcenter</a> and |
| place it in build.gradle dependencies e.g. |
| <code>runtime 'mysql:mysql-connector-java:5.1.36'</code></p> |
| <div class="paragraph"> |
| <p>OR</p> |
| </div> |
| </li> |
| <li> |
| <p>Download the JDBC driver jar and place it in $OFBIZ_HOME/lib or the lib |
| sub-directory of any component</p> |
| </li> |
| </ul> |
| </div> |
| </li> |
| <li> |
| <p>Modify the entityengine.xml file located in |
| $OFBIZ_HOME/framework/entity/config to switch the default database to the one |
| you selected. For more details you can read the relevant section in the |
| <a href="https://cwiki.apache.org/confluence/display/OFBIZ/Apache+OFBiz+Technical+Production+Setup+Guide">technical |
| setup guide</a></p> |
| </li> |
| </ol> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="setup-gradle-tab-completion-on-unix-like-systems">Setup gradle tab-completion on Unix-like systems:</h3> |
| <div class="paragraph"> |
| <p>To get tab completion (auto complete gradle commands by pressing tab) you can |
| download the script from the below link and place it in the appropriate location |
| for your system.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://edub.me/gradle-completion-bash">Gradle tab completion</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>For example, on debian based systems, you can use the following command:</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>sudo curl -L -s <a href="https://edub.me/gradle-completion-bash" class="bare">https://edub.me/gradle-completion-bash</a> -o /etc/bash_completion.d/gradle-tab-completion.bash</code></p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="crypto-notice">Crypto notice</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This distribution includes cryptographic software. The country in which you |
| currently reside may have restrictions on the import, possession, use, and/or |
| re-export to another country, of encryption software. BEFORE using any |
| encryption software, please check your country’s laws, regulations and policies |
| concerning the import, possession, or use, and re-export of encryption software, |
| to see if this is permitted. See <a href="http://www.wassenaar.org/" class="bare">http://www.wassenaar.org/</a> for more information.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The U.S. Government Department of Commerce, Bureau of Industry and Security |
| (BIS), has classified this software as Export Commodity Control Number (ECCN) |
| 5D002.C.1, which includes information security software using or performing |
| cryptographic functions with asymmetric algorithms. The form and manner of this |
| Apache Software Foundation distribution makes it eligible for export under the |
| License Exception ENC Technology Software Unrestricted (TSU) exception (see the |
| BIS Export Administration Regulations, Section 740.13) for both object code and |
| source code.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The following provides more details on the included cryptographic software:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Various classes in OFBiz, including DesCrypt, HashCrypt, and BlowFishCrypt use |
| libraries from the Sun Java JDK API including java.security.* and javax.crypto.* |
| (the JCE, Java Cryptography Extensions API)</p> |
| </li> |
| <li> |
| <p>Other classes such as HttpClient and various related ones use the JSSE (Java |
| Secure Sockets Extension) API</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div id="footer"> |
| <div id="footer-text"> |
| Last updated 2020-08-08 17:08:57 +0200 |
| </div> |
| </div> |
| </body> |
| </html> |