Title: Downloads


<h1>Apache Wink Downloads</h1>

<hr>

<div class="row">
    <div class="span10">
       <p>Apache Wink is distributed in several formats for your convenience.</p>
       <p>You will be prompted for a mirror - if the file is not found on yours, please be patient, as it may take 24 hours to reach all mirrors.</p>
       <p>Apache Wink is distributed under the <a href="http://maven.apache.org/license.html">Apache License, version 2.0</a>.</p>
    </div>
</div>

<hr>

<h2>Download Apache Wink 1.4.0</h2>


<div class="row">
    <div class="span10">
    	<table class="table table-hover">
    	<tr>
    	  <th><b>Name</b></th><th><b>Archive</b></th><th><b>MD5</b></th><th><b>SHA-1</b></th><th><b>Signature</b></th>
    	</tr>

    	<tr>
    		<td>Wink-1.4.0 (tar.gz)</td><td><a href="http://www.apache.org/dyn/closer.cgi/wink/1.4.0/apache-wink-1.4.tar.gz">tar.gz</a></td><td><a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.tar.gz.md5">MD5</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.tar.gz.sha1">SHA-1</a>  </td><td> <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.tar.gz.asc">ASC</a> </td>
    	</tr>

    	<tr>
    		<td> Wink-1.4.0 (zip) </td><td> <a href="http://www.apache.org/dyn/closer.cgi/wink/1.4.0/apache-wink-1.4.zip">zip</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.zip.md5">MD5</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.zip.sha1">SHA-1</a> </td><td> <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4.zip.asc">ASC</a> </td>
    	</tr>

    	<tr>
    		<td> Wink-1.4.0 (Source tar.gz) </td><td> <a href="http://www.apache.org/dyn/closer.cgi/wink/1.4.0/apache-wink-1.4-src.tar.gz">tar.gz</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.tar.gz.md5">MD5</a>  </td><td> <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.tar.gz.sha1">SHA-1</a> </td><td> <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.tar.gz.asc">ASC</a> </td>
    	</tr>

    	<tr>
    		<td> Wink-1.4.0 (Source zip) </td><td> <a href="http://www.apache.org/dyn/closer.cgi/wink/1.4.0/apache-wink-1.4-src.zip">zip</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.zip.md5">MD5</a> </td><td>  <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.zip.sha1">SHA-1</a> </td><td> <a href="http://www.apache.org/dist/wink/1.4.0/apache-wink-1.4-src.zip.asc">ASC</a> </td>
    	</tr>

    	<tr>
    		<td> Release Notes </td><td> <a href="1.4.0/release_notes.html">1.4.0</a> </td><td> </td><td> </td><td> </td></tr><tr class="a"><td> KEYS </td><td> <a href="http://svn.apache.org/repos/asf/wink/tags/wink-1.4.0/KEYS">KEYS</a> </td><td> </td><td> </td><td> </td>
    	</tr>
    	</table>

		<p>Instructions for checking hashes and signatures is indicated on the <a href="http://www.apache.org/info/verification.html">Verifying Apache Software Foundation Releases</a> page.</p>
		<p>You can also retrieve the source files from our svn repository by typing :</p>

		<pre>svn co http://svn.apache.org/repos/asf/wink/tags/wink-1.4.0/</pre>

		<p>Instructions for checking hashes and signatures is indicated on the <a href="http://www.apache.org/info/verification.html">Verifying Apache Software Foundation Releases</a> page.</p>

		<p>You can also retrieve the source files from our svn repository by typing :</p>

		<pre>svn co http://svn.apache.org/repos/asf/wink/tags/wink-1.4.0/</pre>

        <h4> Using Maven </h4>

        <p>We strongly encourage our users to configure a Maven repository mirror closer to their location, please read <a href="http://maven.apache.org/guides/mini/guide-mirror-settings.html">How to Use Mirrors for Repositories</a>.

        <strong>Dependencies</strong>

        <p>Add the following dependencies to your Maven pom.xml to include the Apache Wink Client module or the Server module.</p>

        <strong>Server:</strong>
        <pre>&lt;dependency&gt;
    &lt;groupId&gt;org.apache.wink&lt;/groupId&gt;
    &lt;artifactId&gt;wink-server&lt;/artifactId&gt;
    &lt;version&gt;1.4.0&lt;/version&gt;
&lt;/dependency&gt;</pre>

        <strong>Client:</strong>
        <pre>&lt;dependency&gt;
    &lt;groupId&gt;org.apache.wink&lt;/groupId&gt;
    &lt;artifactId&gt;wink-client&lt;/artifactId&gt;
    &lt;version&gt;1.4.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
    </div>
</div>


<h2>Previous Releases</h2>

<div class="row">
    <div class="span10">
        All previous releases of Apache Wink can be found in the <a href="http://archive.apache.org/dist/wink/">archives</a>.
    </div>
</div>