blob: eaa3628bee3feb27fe4b85b5281ad5cb8de8e86d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<title>Apache Jena - Apache Jena Initialization</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/css/bootstrap-extension.css" rel="stylesheet" type="text/css">
<link href="/css/jena.css" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="/images/favicon.ico" />
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
crossorigin="anonymous"></script>
<script src="/js/jena-navigation.js" type="text/javascript"></script>
<script src="/js/bootstrap.min.js" type="text/javascript"></script>
<script src="/js/improve.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/index.html">
<img class="logo-menu" src="/images/jena-logo/jena-logo-notext-small.png" alt="jena logo">Apache Jena</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav">
<li id="homepage"><a href="/index.html"><span class="glyphicon glyphicon-home"></span> Home</a></li>
<li id="download"><a href="/download/index.cgi"><span class="glyphicon glyphicon-download-alt"></span> Download</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Learn <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-header">Tutorials</li>
<li><a href="/tutorials/index.html">Overview</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki Triplestore</a></li>
<li><a href="/documentation/notes/index.html">How-To's</a></li>
<li><a href="/documentation/query/manipulating_sparql_using_arq.html">Manipulating SPARQL using ARQ</a></li>
<li><a href="/tutorials/rdf_api.html">RDF core API tutorial</a></li>
<li><a href="/tutorials/sparql.html">SPARQL tutorial</a></li>
<li><a href="/tutorials/using_jena_with_eclipse.html">Using Jena with Eclipse</a></li>
<li class="divider"></li>
<li class="dropdown-header">References</li>
<li><a href="/documentation/index.html">Overview</a></li>
<li><a href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a href="/documentation/assembler/index.html">Assembler</a></li>
<li><a href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a href="/documentation/rdfs/">Data with RDFS Inferencing</a></li>
<li><a href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a href="/documentation/inference/index.html">Inference API</a></li>
<li><a href="/documentation/javadoc.html">Javadoc</a></li>
<li><a href="/documentation/ontology/">Ontology API</a></li>
<li><a href="/documentation/permissions/index.html">Permissions</a></li>
<li><a href="/documentation/extras/querybuilder/index.html">Query Builder</a></li>
<li><a href="/documentation/rdf/index.html">RDF API</a></li>
<li><a href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a href="/documentation/io/">RDF I/O</a></li>
<li><a href="/documentation/rdfstar/index.html">RDF-star</a></li>
<li><a href="/documentation/shacl/index.html">SHACL</a></li>
<li><a href="/documentation/shex/index.html">ShEx</a></li>
<li><a href="/documentation/jdbc/index.html">SPARQL over JDBC</a></li>
<li><a href="/documentation/tdb/index.html">TDB</a></li>
<li><a href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a href="/documentation/query/text-query.html">Text Search</a></li>
</ul>
</li>
<li class="drop down">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-book"></span> Javadoc <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/documentation/javadoc.html">All Javadoc</a></li>
<li><a href="/documentation/javadoc/arq/">ARQ</a></li>
<li><a href="/documentation/javadoc_elephas.html">Elephas</a></li>
<li><a href="/documentation/javadoc/fuseki2/">Fuseki</a></li>
<li><a href="/documentation/javadoc/geosparql/">GeoSPARQL</a></li>
<li><a href="/documentation/javadoc/jdbc/">JDBC</a></li>
<li><a href="/documentation/javadoc/jena/">Jena Core</a></li>
<li><a href="/documentation/javadoc/permissions/">Permissions</a></li>
<li><a href="/documentation/javadoc/extras/querybuilder/">Query Builder</a></li>
<li><a href="/documentation/javadoc/shacl/">SHACL</a></li>
<li><a href="/documentation/javadoc/tdb/">TDB</a></li>
<li><a href="/documentation/javadoc/text/">Text Search</a></li>
</ul>
</li>
<li id="ask"><a href="/help_and_support/index.html"><span class="glyphicon glyphicon-question-sign"></span> Ask</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-bullhorn"></span> Get involved <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/getting_involved/index.html">Contribute</a></li>
<li><a href="/help_and_support/bugs_and_suggestions.html">Report a bug</a></li>
<li class="divider"></li>
<li class="dropdown-header">Project</li>
<li><a href="/about_jena/about.html">About Jena</a></li>
<li><a href="/about_jena/architecture.html">Architecture</a></li>
<li><a href="/about_jena/citing.html">Citing</a></li>
<li><a href="/about_jena/team.html">Project team</a></li>
<li><a href="/about_jena/contributions.html">Related projects</a></li>
<li><a href="/about_jena/roadmap.html">Roadmap</a></li>
<li class="divider"></li>
<li class="dropdown-header">ASF</li>
<li><a href="http://www.apache.org/">Apache Software Foundation</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
<li><a href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li>
<li><a href="http://www.apache.org/security/">Security</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
</ul>
</li>
<li id="edit"><a href="https://github.com/apache/jena-site/edit/main/source/documentation/notes/system-initialization.md" title="Edit this page on GitHub"><span class="glyphicon glyphicon-pencil"></span> Edit this page</a></li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-12">
<div id="breadcrumbs">
<ol class="breadcrumb">
<li><a href='/documentation'>DOCUMENTATION</a></li>
<li><a href='/documentation/notes'>NOTES</a></li>
<li class="active">SYSTEM INITIALIZATION</li>
</ol>
</div>
<h1 class="title">Apache Jena Initialization</h1>
<p>Jena has a simple initialization sequence that is
used to setup components available at runtime.</p>
<p>Application code is welcome to also use this mechanism. This
must be done with care. Java initialization can lead to
visibility of uninitialized data.</p>
<p>The standard initialization sequence is<br>
Core -&gt; RIOT -&gt; ARQ -&gt; TDB -&gt; other (including jena text)</p>
<p>The sequence from core to TDB should be executed before application
components. See below for how to control the order.</p>
<p>Initialization occurs when <code>JenaSystem.init()</code> is first called. Jena ensures that this
is done when the application first uses any Jena code by using class
initializers.</p>
<p>See <a href="jena-repack.html">notes on repacking Jena code</a> for how to deal
with ServiceLoader files in repacked jars.</p>
<h2 id="initialization-code">Initialization code</h2>
<p>Initialization code is an implementation of <code>JenaSubsystemLifecycle</code>.
For use in the default initialization, the class must have a zero-argument constructor</p>
<pre><code>public interface JenaSubsystemLifecycle {
public void start() ;
public void stop() ;
default public int level() { return 9999 ; }
}
</code></pre>
<p>The code also supply a level, indicating its place in the order of initialization.
The levels used by Jena are:</p>
<ul>
<li>0 - reserved</li>
<li>10 - Used by jena-core</li>
<li>20 - RIOT</li>
<li>30 - ARQ</li>
<li>40 - TDB</li>
<li>9999 - other</li>
</ul>
<h2 id="the-initialization-process">The Initialization Process</h2>
<p>The process followed by <code>JenaSystem.init()</code> is to obtain an instance of
<code>JenaSubsystemRegistry</code>, ask it to <code>load()</code> initialization code, then call
that code in an order based on declared level. The order of invocation
of different initialization code within the same level is undefined
and may be different from run to run.</p>
<p>Only the first call of <code>JenaSystem.init()</code> causes the process to run.
Any subsequent calls are cheap, so calling <code>JenaSystem.init()</code>
when in doubt about the initialization state is safe.</p>
<p>Overlapping concurrent calls to <code>JenaSystem.init()</code> are thread-safe.
On a return from <code>JenaSystem.init()</code>, Jena has been initialized at some point.</p>
<h2 id="the-standard-subsystem-registry">The Standard Subsystem Registry</h2>
<p>The <code>JenaSubsystemRegistry</code> normally used is based on <code>java.util.ServiceLoader</code>.
It looks for class resources
<code>META-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle</code>
on the classpath during the load step.</p>
<p>See the javadoc for <code>java.util.ServiceLoader</code> for more details.</p>
<p>See also the javadoc for
<a href="/documentation/javadoc/jena/org/apache/jena/system/JenaSystem.html">JenaSystem</a>
and the source code.</p>
<h2 id="debugging">Debugging</h2>
<p>There is a flag <code>JenaSystem.DEBUG_INIT</code> to help with development. It is not
intended for runtime logging.</p>
<p>Jena components print their initialization beginning and end points on
<code>System.err</code> to help track down ordering issues.</p>
<h2 id="modifying-the-standard-process">Modifying the Standard Process</h2>
<p>It is possible, with care, to alter the way
that initialization code is discovered.</p>
<p>An application can change the <code>JenaSubsystemRegistry</code> instance.
This must be done before any Jena code is called anywhere
in the current JVM.</p>
<pre><code>// Example alternative registry.
JenaSubsystemRegistry r = new JenaSubsystemRegistryBasic() {
@Override
public void load() {
if ( JenaSystem.DEBUG_INIT )
System.err.println(&quot;Example custom load&quot;) ;
super.load();
}
} ;
// Set the sub-system registry
JenaSystem.setSubsystemRegistry(r);
// Enable output if required
// JenaSystem.DEBUG_INIT = true ;
// Initialize Jena
JenaSystem.init() ;
</code></pre>
<h2 id="jena-initialization-in-multi-classloader-environments">Jena initialization in multi-classloader environments</h2>
<p>In some applications with multiple classloaders, or different classloader strategies, Jena initialization may
not work as expected. If the Jena initialization debug information shows that components were not loaded correctly,
trying to switch the context class loader may fix the initialization process.</p>
<pre><code>ClassLoader contextClassLoader = null;
try {
contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
JenaSystem.DEBUG_INIT = true;
// ...
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
</code></pre>
</div>
</div>
</div>
<footer class="footer">
<div class="container" style="font-size:80%" >
<p>
Copyright &copy; 2011&ndash;2022 The Apache Software Foundation, Licensed under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
</p>
<p>
Apache Jena, Jena, the Apache Jena project logo, Apache and the Apache feather logos are trademarks of
The Apache Software Foundation.
<br/>
<a href="https://privacy.apache.org/policies/privacy-policy-public.html"
>Apache Software Foundation Privacy Policy</a>.
</p>
</div>
</footer>
<script type="text/javascript">
var link = $('a[href="' + this.location.pathname + '"]');
if (link != undefined)
link.parents('li,ul').addClass('active');
</script>
</body>
</html>