1 % Developing with yaz4j
6 Generate standalone HTML with:
7 pandoc -s -o dev-with-yaz4j.html README.md
13 Yaz4j is a Java binding for the high-level, client-side portion of the YAZ
14 toolkit known as the ZOOM API. With Yaz4j you can program clients for YAZ-
15 supported protocols like Z39.50, SRU/W and Solr. Yaz4j includes a native
16 component and supports Windows, Linux and OSX.
18 Yaz4j is covered by the [Revised BSD](http://www.indexdata.com/licences/revised-bsd) license. That should be same as the the [BSD 3 Clause License](http://opensource.org/licenses/BSD-3-Clause).
23 Index Data provides ready to use yaz4j RPMs for CentOS 5 and 6, available from
24 our public YUM repository. On Windows yaz4j can be installed with the YAZ
25 [installer][4] (select _Windows_ in the _Downloads_ section on the right) Those methods are the simplest ways to get yaz4j up and running
26 on the particular platforms and are highly recommended.
29 Index Data YUM repository (CentOS)
30 ----------------------------------
32 Yaz4j with it's runtime and compilation dependencies are provided through
33 Index Data's YUM repository, the repository is enabled by placing the following
37 name=Index Data Main Repository
38 baseurl=http://ftp.indexdata.com/pub/yum/centos/6/main/$basearch
39 failovermethod=priority
41 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-indexdata
45 under `/etc/yum.repos.d/indexdata.repo` and import the package signing key with:
47 rpm --import http://ftp.indexdata.com/pub/yum/centos/6/RPM-GPG-KEY-indexdata
49 With the above repository enabled, yaz4j can be simply installed with:
53 The installation can be verified by running a provided command-line test
54 program, which executes a search against a public Index Data Z39.50 test server:
56 java -jar /usr/share/java/yaz4j.jar
59 YAZ Installer (Windows)
60 -----------------------
62 YAZ Windows installer can be downloaded from [here][4] (select _Windows_ in
63 the _Downloads_ section on the right). Yaz4j is bundled with
64 the installer: just make sure that during the installation yaz4j box is checked.
65 It is also recommended to check the box for updating the `PATH` environment
66 variable with a path to yaz binaries and DLLs.
68 After installation yaz4j can be tested with (Java runtime environment be [installed][1] separately):
70 java -jar C:\Program Files\YAZ\java\yaz4j.jar
72 All native libraries and binaries are installed to `C:\Program Files\YAZ\bin\`
73 while the `yaz4j.jar` is installed to `C:\Program Files\YAZ\java`.
75 `C:\Program Files\YAZ\` is the default YAZ location on a 64-bit Windows and
76 it is assumed for `yaz-path` in the yaz4j build process.
78 COMPILATION FROM SOURCE
79 =======================
81 Checking out the source code
82 ----------------------------
84 Yaz4j can be checked out from Index Data's Git repository:
86 git clone git://git.indexdata.com/yaz4j
88 It's recommended to build the latest tagged version (see tags with `git tag`),
91 git checkout v1.5 -b v1.5
94 Compilation on CentOS/RHEL
95 --------------------------
97 Compilation requires [JDK][1], [Maven][2], [Swig][3] and [YAZ][4] development
100 Installing build dependencies can be done through the package manager specific
101 for the distribution (subject to availability). For CentOS 5/6 (YUM) JDK and Swig RPMs can be installed with:
103 yum install java-1.7.0-openjdk-devel swig
105 YAZ development package needs to be installed from Index Data's YUM
106 repository (see the INSTALLATION section on how to enable the YUM repo):
108 yum install libyaz5-devel
110 Maven is not part of CentOS so a binary distribution needs to be downloaded
111 from Maven [website][2] and installed manually. Refer to Maven's website for
112 details. In case Index Data's YUM repo is enabled, Maven 3 can also be
115 yum install maven3-indexdata
117 in which case the Maven program is called `mvn-id` rather than `mvn`.
119 With all dependencies in place you can continue the yaz4j compilation with:
124 Which will also run tests that open a connection to Index Data's public Z39.50
127 Notice that `yaz-config` binary must be on the `PATH` (this is assured when
128 `libyaz5-devel` package is installed), if it isn't e.g if a local YAZ (source)
129 installation is used, the binary location can be specified with:
131 mvn -Dyaz.config=/path/to/yaz-config install
133 The compiled jar file ends up in `any/target/yaz4j.jar` while the native library
134 in `unix/target/libyaz4j.so`.
136 Compilation on generic Unix
137 ---------------------------
139 You will need the JDK, Maven, Swig and YAZ development packages.
140 Consult your package manager on how to install those. For compilation
141 of YAZ please consult YAZ [manual][8].
143 If yaz-config is in your `PATH`, the following command should suffice:
147 If yaz-config is not in your `PATH`, you'll have to tell where YAZ is located:
149 mvn -Dyaz.config=/path/to/yaz-config install
154 Besides the exact same requirements as in the Unix case (JDK, Maven, Swig,
155 YAZ), you will need the Windows [SDK][5] installed (which in turn requires
156 .NET Framework 4) to compile yaz4j. Again it's much easier to use the
157 YAZ Installer. Git must be installed to checkout yaz4j source code.
159 Use the command prompt provided with the Windows SDK, navigate to the yaz4j
160 source directory and run:
164 Default 64-bit YAZ installer location, that is`C:\Program Files\YAZ\`,
165 is assumed for the `yaz.path` property. Nothing is assumed for `swig`,
166 so you either need to specify an absolute path or update the `PATH`
167 environment variable to include the directory containing
168 `swig.exe`. Both can be specified with:
170 mvn -Dyaz.path=/path/to/yaz/installdir -Dswig=/path/to/swig/binary install
172 The compiled jar file ends up in `any/target/yaz4j.jar` while the native library
173 in `win32/target/libyaz4j.dll`.
176 YAZ4J AND A SERVLET CONTAINER
177 =============================
179 If you are coding a web application that uses yaz4j there's a couple of things
180 to keep in mind. First, you are not invoking the JVM directly, but the servlet
181 container (e.g Tomcat) run/init script is doing that for you and that's the
182 place to configure any environment settings (e.g the `PATH`). Second, yaz4j
183 includes static initializers to load the native part and can't be packaged
184 along with the webapp as that would break on consecutive redeployments. It must
185 be deployed to the servlet container common classloader, similarly to JDBC
188 For convenience, `yaz4j-tomcat6` RPM is provided in the ID's YUM repo which will
189 set up the default CentOS-provided Tomcat 6 with yaz4j automatically:
191 sudo yum install yaz4j-tomcat6
196 In the case when yaz4j is installed through the RPM (Index Data's YUM repo) the
197 native libraries are placed in the standard system locations (/usr/lib/.. etc)
198 and are readily available to all applications, including Tomcat. The only other
199 thing to configure is to add yaz4j.jar (the pure Java component) to Tomcat's
200 common class loader (further down).
202 In the case when yaz4j is built from source or for some other reason the native
203 parts are not present in the standard system library locations, they need to be
204 placed on the servlet container's shared libraries load path. One way
205 to do this in Tomcat (assuming Tomcat is run from a tarball rather than RPM) is
206 by editing (create it if it does not exist) the `CATALINA_HOME/bin/setenv.sh`
207 script and putting the following lines in there:
209 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libyaz4j.so
210 export LD_LIBRARY_PATH
212 Notice, that this has to be done for all native libraries that `yaz4j.so`
213 depends on, e.g `libyaz5.so` and so on, unless they are already on the default
214 system library paths (e.g when installed from RPMs).
216 If Tomcat is started by a custom init scripts similar operation needs to be
219 The pure Java yaz4j.jar must be added to Tomcat's common classloader so that
220 it becomes available to all deployed webapps and is loaded only once. There
221 are a couple ways to do that.
223 One (employed by `yaz4j-tomcat6` RPM) is to place (or symlink) `yaz4j.jar` to
224 to `CATALINA_BASE/lib` (`CATALINA_BASE` is `/usr/share/tomcat6` when Tomcat is
225 installed from RPMs on CentOS):
227 ln -s /path/to/yaz4j.jar /usr/share/tomcat6/lib
231 Another option is to edit the file `catalina.properties` shipped with Tomcat
232 (and located in `CATALINA_BASE/conf/` e.g `/etc/tomcat6/`on RPM-packaged Tomcat)
233 and extend the `common.loader=` property with the following:
235 common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/path/to/yaz4j.jar
237 again restarting Tomcat afterwards.
239 Please consult Tomcat documentation for more information on [classloading][6].
244 On Windows Tomcat will most likely be run from the binary distribution which
245 includes `CATALINA_BASE/bin/setenv.bat` for the purpose of setting up the
246 environment. Unless, you have installed yaz4j.dll through the YAZ Installer and
247 checked the option to update the global `PATH` and include all native YAZ and
248 yaz4j components or you have set up the global `PATH` on your own, edit
249 `setenv.bat` with the following:
251 set PATH=%PATH;X:\path\to\yaz\bin;X:\path\to\yaz4j.dll
253 The `X:\path\to\yaz\bin` is `C:\Program Files\YAZ\bin` when the installer was
254 used and includes also yaz4j.dll.
256 In case Tomcat start up does not execute `setenv.sh`, e.g when custom startup
257 script is used, please include similar steps there.
259 To deploy `yaz4j.jar` you must edit `catalina.properties` files, see the Linux
260 section for details. Again, when the YAZ installer is used `yaz4j.jar` is
261 located at `C:\Program Files\YAZ\java\yaz4j.jar` by default.
267 Under `yaz4j/examples` you'll find a small webapp called `zgate`. This can be
268 deployed to Tomcat to test the yaz4j installation. To do so:
270 cd yaz4j/examples/zgate
272 cp target/zgate.war CATALINA_BASE/webapps
274 (substitute / with \\ and copy as necessary under Windows!)
276 If successful you can run the application with a URL as follows:
278 [http://localhost:8080/zgate/?zurl=z3950.indexdata.com/marc&query=computer&syntax=usmarc](http://localhost:8080/zgate/?zurl=z3950.indexdata.com/marc&query=computer&syntax=usmarc)
280 You should see results from the Index Data's test z3950 server.
282 PREPARING A DEVELOPMENT ENVIRONMENT
283 ===================================
288 If you are using maven to build your application you can include Index Data's
289 maven repository and include yaz4j as a dependency in your jar or war project:
291 Index Data's Maven repository (put under `<repositories/>` in pom.xml):
294 <id>id-maven-repo</id>
295 <name>Indexdata Maven Repository</name>
296 <url>http://maven.indexdata.com/</url>
299 Yaz4j API dependency (put under `<dependencies/>` in pom.xml):
302 <groupId>org.yaz4j</groupId>
303 <artifactId>yaz4j-any</artifactId>
304 <version>VERSION</version>
305 <scope>provided</scope>
309 It's crucial that the scope of this dependency is set to `provided` for web
310 application type projects, otherwise the library would end up packaged in
311 the .war archive and we wouldn't want that.
313 Yaz4j includes a trivial HTTP to z3590 gateway under `examples/zgate` that shows
314 best how to use yaz4j in a servlet. There's also a blog entry on building the
318 [1]: http://www.oracle.com/technetwork/java/javase/downloads/index.html "JDK"
320 [2]: http://maven.apache.org/download.cgi "Maven"
322 [3]: http://www.swig.org/download.html "Swig"
324 [4]: http://www.indexdata.com/yaz "YAZ"
326 [5]: http://www.microsoft.com/en-us/download/details.aspx?id=8279 "Windows SDK"
328 [6]: https://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html "Tomcat 6 class loading"
330 [7]: http://www.indexdata.com/blog/2010/02/building-simple-http-z3950-gateway-using-yaz4j-and-tomcat "Building a simple HTTP-to-Z39.50 gateway using Yaz4j and Tomcat"
332 [8]: http://www.indexdata.com/yaz/doc/installation.html "YAZ Compilation"