<!DOCTYPE html>


<!--
 | Generated by Apache Maven Doxia Site Renderer 1.11.1 from src/site/apt/adminguide/webservices/rest.apt.vm
 | Rendered using Apache Maven Fluido Skin 1.11.0
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="generator" content="Apache Maven Doxia Site Renderer 1.11.1" />
    <meta name="author" content="Olivier Lamy" />
    <meta name="date" content="2011-10-05" />
    <title>Archiva Documentation &#x2013; Using REST Services</title>
    <link rel="stylesheet" href="../../css/apache-maven-fluido-1.11.0.min.css" />
    <link rel="stylesheet" href="../../css/site.css" />
    <link rel="stylesheet" href="../../css/print.css" media="print" />
    <script src="../../js/apache-maven-fluido-1.11.0.min.js"></script>
    <!-- Google Analytics -->
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
       (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
      ga('create', 'UA-140879-5', 'auto');
      ga('send', 'pageview');
      ga('set', 'anonymizeIp', true);
      ga('set', 'forceSSL', true);
    </script>

    <!-- Matomo -->
    <script>
        var _paq = window._paq = window._paq || [];
                _paq.push(['disableCookies']);
                    _paq.push(['trackPageView']);
                    _paq.push(['enableLinkTracking']);
        
        (function() {
            var u="https://analytics.apache.org";
            _paq.push(['setTrackerUrl', u+'/matomo.php']);
            _paq.push(['setSiteId', '10']);
            var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
            g.async=true; g.src=u+'/matomo.js'; s.parentNode.insertBefore(g,s);
        })();
    </script>
    <!-- End Matomo Code -->
  </head>
  <body class="topBarDisabled">
    <a href="https://github.com/apache/archiva">
      <img style="position: absolute; top: 0; right: 0; border: 0; z-index: 10000;"
        src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png"
        alt="Fork me on GitHub">
    </a>
    <div class="container-fluid">
      <header>
        <div id="banner">
          <div class="pull-left"><a href="http://archiva.apache.org/" id="bannerLeft"><img src="http://archiva.apache.org/images/archiva.png"  alt="Apache Archiva" style="" /></a></div>
          <div class="pull-right"><a href="https://www.apache.org/" id="bannerRight"><img src="https://www.apache.org/images/asf_logo_wide_2016.png"  alt="Apache Software Foundation" style="" /></a></div>
          <div class="clear"><hr/></div>
        </div>

        <div id="breadcrumbs">
          <ul class="breadcrumb">
      <li class=""><a href="https://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../../../../index.html" title="Archiva">Archiva</a><span class="divider">/</span></li>
      <li class=""><a href="../../index.html" title="Archiva Documentation">Archiva Documentation</a><span class="divider">/</span></li>
    <li class="active ">Using REST Services</li>
        <li id="publishDate" class="pull-right"><span class="divider">|</span> Last Published: 2022-07-25</li>
          <li id="projectVersion" class="pull-right">Version: 3.0.0-SNAPSHOT</li>
          </ul>
        </div>
      </header>
      <div class="row-fluid">
        <header id="leftColumn" class="span2">
          <nav class="well sidebar-nav">
  <ul class="nav nav-list">
   <li class="nav-header">Introduction</li>
    <li><a href="../../quick-start.html" title="Quick Start"><span class="none"></span>Quick Start</a></li>
    <li><a href="../../tour/index.html" title="Feature Tour"><span class="none"></span>Feature Tour</a></li>
    <li><a href="../../release-notes.html" title="Release Notes"><span class="none"></span>Release Notes</a></li>
    <li><a href="../../../../download.html" title="Downloads"><span class="none"></span>Downloads</a></li>
   <li class="nav-header">Users Guide</li>
    <li><a href="../../userguide/browsing.html" title="Browsing"><span class="none"></span>Browsing</a></li>
    <li><a href="../../userguide/searching.html" title="Searching"><span class="none"></span>Searching</a></li>
    <li><a href="../../userguide/delete-artifact.html" title="Deleting an Artifact"><span class="none"></span>Deleting an Artifact</a></li>
    <li><a href="../../userguide/using-repository.html" title="Using as a repository"><span class="none"></span>Using as a repository</a></li>
    <li><a href="../../userguide/deploy.html" title="Deploying to repository"><span class="none"></span>Deploying to repository</a></li>
    <li><a href="../../userguide/virtual-repositories.html" title="Configuring Virtual Repositories"><span class="none"></span>Configuring Virtual Repositories</a></li>
    <li><a href="../../userguide/rss.html" title="Rss Feeds in Archiva"><span class="none"></span>Rss Feeds in Archiva</a></li>
    <li><a href="../../userguide/querying-artifacts.html" title="Querying Artifacts"><span class="none"></span>Querying Artifacts</a></li>
   <li class="nav-header">Administrators Guide</li>
    <li><a href="../../adminguide/installing.html" title="Installing Archiva"><span class="icon-chevron-right"></span>Installing Archiva</a></li>
    <li><a href="../../adminguide/databases.html" title="Databases"><span class="none"></span>Databases</a></li>
    <li><a href="../../adminguide/repositories-content-storage.html" title="Repositories Content Storage"><span class="none"></span>Repositories Content Storage</a></li>
    <li><a href="../../adminguide/security.html" title="Security"><span class="icon-chevron-right"></span>Security</a></li>
    <li><a href="../../adminguide/configuration.html" title="Archiva Configuration"><span class="icon-chevron-right"></span>Archiva Configuration</a></li>
    <li class="active"><a><span class="none"></span>REST Apis</a></li>
    <li><a href="../../adminguide/configuration-files.html" title="Configuration Files"><span class="none"></span>Configuration Files</a></li>
    <li><a href="../../adminguide/system-status.html" title="System Status"><span class="none"></span>System Status</a></li>
    <li><a href="../../adminguide/logging.html" title="Log Files"><span class="icon-chevron-right"></span>Log Files</a></li>
    <li><a href="../../adminguide/reports.html" title="Reports"><span class="none"></span>Reports</a></li>
   <li class="nav-header">Customising Archiva</li>
    <li><a href="../../customising/writing-consumer.html" title="Writing a Consumer Plugin"><span class="none"></span>Writing a Consumer Plugin</a></li>
   <li class="nav-header">More Information</li>
    <li><a href="https://cwiki.apache.org/confluence/display/ARCHIVA/Index" class="externalLink" title="Archiva Wiki"><span class="none"></span>Archiva Wiki</a></li>
   <li class="nav-header">ASF</li>
    <li><a href="https://www.apache.org/foundation/how-it-works.html" class="externalLink" title="How Apache Works"><span class="none"></span>How Apache Works</a></li>
    <li><a href="https://www.apache.org/foundation/" class="externalLink" title="Foundation"><span class="none"></span>Foundation</a></li>
    <li><a href="https://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsoring Apache"><span class="none"></span>Sponsoring Apache</a></li>
    <li><a href="https://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a></li>
   <li class="nav-header">Project Documentation</li>
    <li><a href="../../project-info.html" title="Project Information"><span class="icon-chevron-right"></span>Project Information</a></li>
  </ul>
          </nav>
          <div class="well sidebar-nav">
<form id="search-form" action="https://www.google.com/search" method="get" >
  <input value="https://archiva.apache.org/docs/3.0.0-SNAPSHOT/" name="sitesearch" type="hidden"/>
  <input class="search-query" name="q" id="query" type="text" />
</form>
<script>asyncJs( 'https://cse.google.com/brand?form=search-form' )</script>
            <div id="poweredBy">
              <div class="clear"></div>
    <div id="twitter" style="border:none; margin-top: 10px">
    <a href="https://twitter.com/archiva" class="twitter-follow-button" data-show-count="false" data-align="left" data-size="medium" data-show-screen-name="true" data-lang="en">Follow archiva</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
    </div>
              <div class="clear"></div>
              <div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../../images/logos/maven-feather.png" /></a>
            </div>
          </div>
        </header>
        <main id="bodyColumn"  class="span10" >
<section>
<h2><a name="Using_REST_Services"></a>Using REST Services</h2>
<p>Starting version 1.4, you can use some REST Services to manage your Apache Archiva instance and Search artifacts. All samples here will use Apache CXF REST client API. By the way you can use some others REST client frameworks. NOTE: a wadl is available in your Archiva instance : http(s)://ip:port/../restServices/application.wadl</p>
<ul>
<li>Archiva REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-rest-api/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-rest-api/index.html</a></li>
<li>Archiva UI REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-ui/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-archiva-ui/index.html</a></li>
<li>Redback REST api is available here: <a class="externalLink" href="http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-redback-rest-api/index.html">http://archiva.apache.org/docs/3.0.0-SNAPSHOT/rest-docs-redback-rest-api/index.html</a></li></ul><section>
<h3><a name="Security_related_information"></a>Security related information</h3>
<p>Starting with version 2.2.2 we added HTTP verification techniques to avoid cross site request forgery attacks. The updating services check Origin and Referer header and use a token provided by the login service. If you use the webservices with a native client that is no browser or want to allow requests from different origin URLs you have to change the configuration. For further information see the <a href="/redback/integration/rest.html">Redback REST documentation</a></p></section><section>
<h3><a name="Search_Service"></a>Search Service</h3>
<p>Authentication headers for connect to your Archiva instance :</p>
<div class="source"><pre class="prettyprint">    // guest with an empty password
    public static String guestAuthzHeader =
        &quot;Basic &quot; + org.apache.cxf.common.util.Base64Utility.encode( ( &quot;guest&quot; + &quot;:&quot; ).getBytes() );

    // with an other login/password
    //public String authzHeader =
    //    &quot;Basic &quot; + org.apache.cxf.common.util.Base64Utility.encode( ( &quot;login&quot; + &quot;:password&quot; ).getBytes() );

</pre></div>
<p>Get a Search Service Client :</p>
<div class="source"><pre class="prettyprint">SearchService service =
    JAXRSClientFactory.create( getBaseUrl() + &quot;/&quot; + getRestServicesPath() + &quot;/archivaServices/&quot;,
                               SearchService.class,
                               Arrays.asList( new JacksonJaxbJsonProvider( ), new JacksonJaxbXMLProvider( ) )  );
// to add authentification
if ( authzHeader != null )
{
    WebClient.client( service ).header( &quot;Authorization&quot;, authzHeader );
}
// Set the Referer header to your archiva server url
WebClient.client(service).header(&quot;Referer&quot;,&quot;http://localhost:&quot;+getServerPort());
// to configure read timeout
WebClient.getConfig( service ).getHttpConduit().getClient().setReceiveTimeout( 100000000 );
// if you want to use json as exchange format xml is supported too
WebClient.client( service ).accept( MediaType.APPLICATION_JSON_TYPE );
WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
return service;
</pre></div>
<p>Quick Search</p>
<div class="source"><pre class="prettyprint">List&lt;Artifact&gt; artifacts = searchService.quickSearch( &quot;commons-logging&quot; );
// return all artifacts with groupId OR artifactId OR version OR packaging OR className
// NOTE : only artifacts with classifier empty are returned
</pre></div>
<p>Search Artifacts Version : to search all availables version with a groupId and artifactId and packaging (if empty jar is used)</p>
<div class="source"><pre class="prettyprint">        SearchService searchService = getSearchService( authorizationHeader );

        List&lt;Artifact&gt; artifacts = searchService.getArtifactVersions( &quot;commons-logging&quot;, &quot;commons-logging&quot;, &quot;jar&quot; );

</pre></div>
<p>Search Service with a classifier :</p>
<div class="source"><pre class="prettyprint">        SearchRequest searchRequest = new SearchRequest();
        searchRequest.setGroupId( &quot;commons-logging&quot; );
        searchRequest.setArtifactId( &quot;commons-logging&quot; );
        searchRequest.setClassifier( &quot;sources&quot; );

        List&lt;Artifact&gt; artifacts = searchService.searchArtifacts( searchRequest );
</pre></div>
<p>Search Service with a classifier :</p>
<div class="source"><pre class="prettyprint">        SearchRequest searchRequest = new SearchRequest();
        searchRequest.setGroupId( &quot;commons-logging&quot; );
        searchRequest.setArtifactId( &quot;commons-logging&quot; );
        searchRequest.setClassifier( &quot;sources&quot; );

        List&lt;Artifact&gt; artifacts = searchService.searchArtifacts( searchRequest );
</pre></div>
<p>Copy Artifact from a repository to an other one :</p>
<p>For some reasons you want to use a test repository before moving your artifacts to a repository used by final users. To achieve this, you can use a service which can copy an artifact from a repository to an other one</p>
<div class="source"><pre class="prettyprint">// configure the artifact you want to copy
// if package ommited default will be jar
ArtifactTransferRequest artifactTransferRequest = new ArtifactTransferRequest();
artifactTransferRequest.setGroupId( &quot;org.apache.karaf.features&quot; );
artifactTransferRequest.setArtifactId( &quot;org.apache.karaf.features.core&quot; );
artifactTransferRequest.setVersion( &quot;2.2.2&quot; );
artifactTransferRequest.setRepositoryId( SOURCE_REPO_ID );
artifactTransferRequest.setTargetRepositoryId( TARGET_REPO_ID );
// retrieve the service
RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader );
// copy the artifact
Boolean res = repositoriesService.copyArtifact( artifactTransferRequest ).isSuccess();
</pre></div>
<p>To know all the possible options, you can refer to the javadoc of SearchRequest class.</p></section><section>
<h3><a name="Browse_Service"></a>Browse Service</h3>
<p>Get a Browse Service Client :</p>
<div class="source"><pre class="prettyprint">        BrowseService service =
            JAXRSClientFactory.create( getBaseUrl() + &quot;/&quot; + getRestServicesPath() + &quot;/archivaServices/&quot;,
                                       BrowseService.class,
                                       Arrays.asList( new JacksonJaxbJsonProvider( ), new JacksonJaxbXMLProvider( ) )  );
        // to add authentification
        if ( authzHeader != null )
        {
            WebClient.client( service ).header( &quot;Authorization&quot;, authzHeader );
        }
        // Set the Referer header to your archiva server url
        WebClient.client(service).header(&quot;Referer&quot;,&quot;http://localhost:&quot;+getServerPort());

        WebClient.getConfig( service ).getHttpConduit().getClient().setReceiveTimeout( 100000000 );
        if ( useXml )
        {
            WebClient.client( service ).accept( MediaType.APPLICATION_XML_TYPE );
            WebClient.client( service ).type( MediaType.APPLICATION_XML_TYPE );
        }
        else
        {
            WebClient.client( service ).accept( MediaType.APPLICATION_JSON_TYPE );
            WebClient.client( service ).type( MediaType.APPLICATION_JSON_TYPE );
        }
        return service;
</pre></div>
<p>Get artifacts based on project version metadata, generic metadata added previously in Archiva :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        browseService.addMetadata( &quot;commons-cli&quot;, &quot;commons-cli&quot;, &quot;1.0&quot;, &quot;wine&quot;, &quot;bordeaux&quot;, TEST_REPO_ID );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.getArtifactsByProjectVersionMetadata( &quot;wine&quot;, &quot;bordeaux&quot;, TEST_REPO_ID );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 3 );
</pre></div>
<p>Get artifacts based on the artifact properties :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        List&lt;Artifact&gt; artifactDownloadInfos = browseService.getArtifactsByMetadata( &quot;type&quot;, &quot;pom&quot;, TEST_REPO_ID );

        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 11 );
</pre></div>
<p>Get artifacts based on the project properties from POM :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.getArtifactsByProperty( &quot;org.name&quot;, &quot;The Apache Software Foundation&quot;, TEST_REPO_ID );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
</pre></div>
<p>Searching by properties and metadata :</p>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        List&lt;Artifact&gt; artifactDownloadInfos =
            browseService.searchArtifacts( &quot;org.name&quot;, &quot;The Apache Software Foundation&quot;, TEST_REPO_ID, true );

        assertThat( artifactDownloadInfos ).isNotNull().isNotEmpty().hasSize( 7 );
</pre></div>
<div class="source"><pre class="prettyprint">        BrowseService browseService = getBrowseService( authorizationHeader, true );

        tryAssert( ( ) -&gt; {
            List&lt;Artifact&gt; artifactDownloadInfos =
                browseService.searchArtifacts( &quot;The Apache Software Foundation&quot;, TEST_REPO_ID, true );

            assertThat( artifactDownloadInfos ).isNotNull( ).isNotEmpty( ).hasSize( 7 );
        } );
</pre></div>
<p>Get Search</p>
<div class="source"><pre class="prettyprint">List&lt;Artifact&gt; artifacts = searchService.quickSearch( &quot;commons-logging&quot; );
// return all artifacts with groupId OR artifactId OR version OR packaging OR className
// NOTE : only artifacts with classifier empty are returned
</pre></div>
<p>Dependencies to add in order to use those REST Services</p>
<div class="source"><pre class="prettyprint">      
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-jaxrs-json-provider&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-jaxrs-xml-provider&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.dataformat&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-dataformat-xml&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-jaxrs-base&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
      &lt;/dependency&gt;


      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-frontend-jaxrs&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
        &lt;exclusions&gt;
          &lt;exclusion&gt;
            &lt;groupId&gt;javax.annotation&lt;/groupId&gt;
            &lt;artifactId&gt;javax.annotation-api&lt;/artifactId&gt;
          &lt;/exclusion&gt;
        &lt;/exclusions&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-rs-client&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-rs-extension-providers&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-features-logging&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
        &lt;artifactId&gt;cxf-rt-rs-service-description-openapi-v3&lt;/artifactId&gt;
        &lt;version&gt;${cxf.version}&lt;/version&gt;
      &lt;/dependency&gt;

      &lt;dependency&gt;
        &lt;groupId&gt;io.swagger.core.v3&lt;/groupId&gt;
        &lt;artifactId&gt;swagger-core&lt;/artifactId&gt;
        &lt;scope&gt;compile&lt;/scope&gt;
        &lt;version&gt;${io.swagger.version}&lt;/version&gt;
        &lt;exclusions&gt;
          &lt;exclusion&gt;
            &lt;groupId&gt;javax.ws.rs&lt;/groupId&gt;
            &lt;artifactId&gt;jsr311-api&lt;/artifactId&gt;
          &lt;/exclusion&gt;
        &lt;/exclusions&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;io.swagger.core.v3&lt;/groupId&gt;
        &lt;artifactId&gt;swagger-jaxrs2&lt;/artifactId&gt;
        &lt;version&gt;${io.swagger.version}&lt;/version&gt;
        &lt;exclusions&gt;
          &lt;exclusion&gt;
            &lt;groupId&gt;javax.ws.rs&lt;/groupId&gt;
            &lt;artifactId&gt;jsr311-api&lt;/artifactId&gt;
          &lt;/exclusion&gt;
        &lt;/exclusions&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;io.swagger.core.v3&lt;/groupId&gt;
        &lt;artifactId&gt;swagger-annotations&lt;/artifactId&gt;
        &lt;version&gt;${io.swagger.version}&lt;/version&gt;
        &lt;exclusions&gt;
          &lt;exclusion&gt;
            &lt;groupId&gt;javax.ws.rs&lt;/groupId&gt;
            &lt;artifactId&gt;jsr311-api&lt;/artifactId&gt;
          &lt;/exclusion&gt;
        &lt;/exclusions&gt;
      &lt;/dependency&gt;


      &lt;dependency&gt;
        &lt;groupId&gt;org.apache.archiva&lt;/groupId&gt;
        &lt;artifactId&gt;archiva-rest-api&lt;/artifactId&gt;
        &lt;version&gt;${project.version}&lt;/version&gt;
      &lt;/dependency&gt;
</pre></div>
<p>Current versions use in Apache Archiva:</p>
<ul>
<li><code>${project.version}</code>: 3.0.0-SNAPSHOT</li>
<li><code>${cxfVersion}</code>: $<a name="cxf.version">cxf.version</a></li>
<li><code>${jacksonVersion}</code>: $<a name="jacksonVersion">jacksonVersion</a></li></ul></section><section>
<h3><a name="Security_Framework_Services:"></a>Security Framework Services:</h3>
<p>You can use Redback Rest Services to control user creation/modification and add/remove roles.</p>
<p>See <a class="externalLink" href="http://archiva.apache.org/redback/integration/rest.html">http://archiva.apache.org/redback/integration/rest.html</a></p></section></section>
        </main>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
<div class="row">
      <div class="span6 offset1">Apache Archiva, Archiva, Apache, the Apache feather logo, and the Apache Archiva project logos are trademarks of The Apache Software Foundation.</div>
      </div>
      <div class="row">
        &nbsp;
      </div>
      <div class="row">
      <div class="span6 offset2">
      <p>
        <a href="https://archiva.apache.org/docs/3.0.0-SNAPSHOT/privacy-policy.html">Privacy Policy</a>
        </p>
      </div>
      </div>
        </div>
      </div>
    </footer>
<script>
	if(anchors) {
	  anchors.add();
	}
</script>
  </body>
</html>