Artifactory Java client provides simple yet powerful Artifactory connection and management within your Java code.
The client aallows managing Artifactory repositories, users, groups, permissions and system configuration. It also allows searches, upload and download artifacts to or from Artifactory and a lot more.
Add the following dependency to your pom.xml
file:
<dependency>
<groupId>org.jfrog.artifactory.client</groupId>
<artifactId>artifactory-java-client-services</artifactId>
<version>LATEST</version>
</dependency>
Add the following snippets to your build.gradle
file:
repositories {
jcenter()
}
dependencies {
compile 'org.jfrog.artifactory.client:artifactory-java-client-services:+'
}
This section includes a few usage examples of the Java client APIs from your application code.
Artifactory artifactory = ArtifactoryClient.create("ArtifactoryUrl", "username", "password");
File file = new File("fileToUpload.txt");
File result = artifactory.repository("RepoName").upload("path/to/newName.txt", file).doUpload();
File file = new File("fileToUpload.txt");
File deployed = artifactory.repository("RepoName")
.upload("path/to/newName.txt", file)
.withProperty("color", "blue")
.withProperty("color", "red")
.doUpload();
InputStream iStream = artifactory.repository("RepoName")
.download("path/to/fileToDownload.txt")
.doDownload();
InputStream iStream = artifactory.repository("RepoName")
.download("path/to/fileToDownload.txt")
.withProperty("colors", "red")
.doDownload();
InputStream iStream = artifactory.repository("RepoName")
.download("path/to/fileToDownload.txt")
.withMandatoryProperty("colors", "red")
.doDownload();
File file = artifactory.repository("RepoName").file("path/to/file.txt").info();
boolean isFile = file.isFolder();
long fileSize = file.getSize();
String fileUri = file.getDownloadUri();
String md5Checksum = file.getChecksums().getMd5();
String sha1Checksum = file.getChecksums().getSha1();
Folder folder = artifactory.repository("RepoName").folder("path/to/folder").info();
boolean isFolder = folder.isFolder();
String repoName = folder.getRepo();
String folderPath = folder.getPath();
int childrenItemsSize = folder.getChildren().size();
Repository repo = artifactory.repository("RepoName").get();
String repoKey = repo.getKey();
String desc = repo.getDescription();
String layout = repo.getRepoLayoutRef();
RepositoryType repoClass = repo.getRclass();
RepositorySettings settings = repo.getRepositorySettings();
PackageType packageType = settings.getPackageType();
if (PackageType.bower == packageType) {
BowerRepositorySettings settingsForBower = (BowerRepositorySettings)settings;
String bowerRegistryUrl = settingsForBower.getBowerRegistryUrl();
}
BinariesSummary binariesSummary = artifactory.storage().getStorageInfo().getBinariesSummary();
FileStorageSummary fileStorageSummary = artifactory.storage().getStorageInfo().getFileStoreSummary();
for (RepositorySummary repoSummary : artifactory.storage().getStorageInfo().getRepositoriesSummaryList()) {
repoSummary.getRepoKey();
}
ItemHandle fileItem = artifactory.repository("RepoName").file("path/to/file.txt");
ItemHandle folderItem = artifactory.repository("RepoName").folder("path/to/folder");
ItemHandle item = ...
ItemHandle newItem = item.copy("ToRepoName", "path/to/item");
ItemHandle item = ...
ItemHandle newItem = item.move("ToRepoName", "path/to/item");
String result = artifactory.repository("RepoName").delete("path/to/item");
List<LightweightRepository> repoList = artifactory.repositories().list(LOCAL);
DebianRepositorySettingsImpl settings = new DebianRepositorySettingsImpl();
settings.setDebianTrivialLayout(true);
Repository repository = artifactory.repositories()
.builders()
.localRepositoryBuilder()
.key("NewRepoName")
.description("new local repository")
.repositorySettings(settings)
.build();
String result = artifactory.repositories().create(2, repository);
Repository repository = artifactory.repository("RepoName").get();
RepositorySettings settings = repository.getRepositorySettings();
if (PackageType.debian == settings.getPackageType()) {
DebianRepositorySettingsImpl settingsForDebian = (DebianRepositorySettingsImpl) settings;
settingsForDebian.setDebianTrivialLayout(false);
}
Repository updatedRepository = artifactory.repositories()
.builders()
.builderFrom(repository)
.description("new_description")
.build();
String result = artifactory.repositories().update(updatedRepository);
String result = artifactory.repository("RepoName").delete();
Repository repository = artifactory.repository("RepoName").get();
XraySettings xraySettings = repository.getXraySettings();
xraySettings.setXrayIndex(true)
xraySettings.setBlockXrayUnscannedArtifacts(true)
xraySettings.setXrayMinimumBlockedSeverity('Minor')
Repository updatedRepository = artifactory.repositories()
.builders()
.builderFrom(repository)
.description("new_description")
.build();
String result = artifactory.repositories().update(updatedRepository);
A smart remote repository is a remote repository that proxies a repository from another instance of Artifactory. Smart remote repositories are configured with four additional properties.
RemoteRepository remoteRepository = (RemoteRepository) artifactory.repository("SmartRemoteRepoName").get();
ContentSync contentSync = remoteRepository.getContentSync();
contentSync.setEnabled(true);
// Report Statistics
contentSync.getStatistics().setEnabled(true);
// Sync Properties
contentSync.getProperties().setEnabled(true);
// Source Absence Detection
contentSync.getSource().setOriginAbsenceDetection(true);
Repository updatedRepository = artifactory.repositories()
.builders()
.builderFrom(remoteRepository)
.listRemoteFolderItems(true) // List Remote Folder Items
.build();
String result = artifactory.repositories().update(updatedRepository);
Searches repositories(String... repositories);
Searches artifactsByName(String name);
Searches artifactsCreatedSince(long sinceMillis);
Searches artifactsCreatedInDateRange(long fromMillis, long toMillis);
Searches artifactsByGavc();
Searches artifactsLatestVersion();
List<RepoPath> searchItems = artifactory.searches()
.repositories("RepoName", "RepoName2")
.artifactsByName("prefixedWith*.txt")
.doSearch();
for (RepoPath searchItem : searchItems) {
String repoKey = searchItem.getRepoKey();
String itemPath = searchItem.getItemPath();
}
List<RepoPath> searchItems = artifactory.searches()
.repositories("RepoName", "RepoName2")
.itemsByProperty()
.property("released")
.property("colors", "r*?")
.doSearch();
for (RepoPath searchItem : searchItems) {
String repoKey = searchItem.getRepoKey();
String itemPath = searchItem.getItemPath();
}
List<RepoPath> results = artifactory.searches().artifactsByGavc()
.groupId("com.example")
.artifactId("com.example.test")
.version("1.0.0")
.classifier("zip")
.doSearch();
for (RepoPath searchItem : searchItems) {
String repoKey = searchItem.getRepoKey();
String itemPath = searchItem.getItemPath();
}
List<RepoPath> results = artifactory.searches().artifactsByGavc()
.groupId("com.example")
.artifactId("com.example.test")
.repositories("liba-release-local")
.doSearch();
for (RepoPath searchItem : searchItems) {
String repoKey = searchItem.getRepoKey();
String itemPath = searchItem.getItemPath();
}
String latestVersion = artifactory.searches().artifactsLatestVersion()
.groupId("com.example")
.artifactId("com.example.test")
.repositories("liba-release-local")
.doRawSearch();
User user = artifactory.security().user("userName");
String name = user.getName();
String email = user.getEmail();
Collection<String> groups = user.getGroups();
Date loggedIn = user.getLastLoggedIn();
boolean profileUpdatable = user.isProfileUpdatable();
boolean isAdmin = user.isAdmin();
boolean internalPass = user.isInternalPasswordDisabled();
String realm = user.getRealm();
Collection<String> userNames = artifactory.security().userNames();
for (String userName : userNames) {
User user = artifactory.security().user(userName);
}
UserBuilder userBuilder = artifactory.security().builders().userBuilder();
User user = userBuilder.name("userName)
.email("[email protected]")
.admin(false)
.profileUpdatable(true)
.password("password")
.build();
artifactory.security().createOrUpdate(user);
String result = artifactory.security().deleteUser("userName");
Group group = artifactory.security().group("groupName");
String description = group.getDescription();
boolean isAutoJoin = group.isAutoJoin();
List<String> groupNames = artifactory.security().groupNames();
for (String groupName : groupNames) {
Group group = artifactory.security().group(groupName);
}
Group group = artifactory.security().builders().groupBuilder()
.name("groupName")
.autoJoin(true)
.description("new group")
.build();
artifactory.security().createOrUpdateGroup(group);
When using LDAP integration or realm User plugin, it could be interesting to preload groups (and permissions) before any user login :
String realmAttributes = "ldapGroupName=groupName;groupsStrategy=STATIC;groupDn=cn=GROUPNAME,ou=foo,o=bar";
Group group = artifactory.security().builders().groupBuilder()
.name("groupName")
.description("GROUPNAME")
.realm("ldap")
.realmAttributes(realmAttributes)
.build();
artifactory.security().createOrUpdateGroup(group);
NB: The realmAttributes depends of realm implementation ; so firstly, use LDAP Groups Synchronization to import some groups manually in Artifactory, and analyse a JSON GET on one of this/these group(s) to understand the content of realmAttributes parameter.
artifactory.security().deleteGroup("groupName");
Set<ItemPermission> itemPermissions = artifactory.repository("RepoName")
.file("path/to/file.txt")
.effectivePermissions();
for (ItemPermission itemPermission : itemPermissions) {
RepoPath repoPath = itemPermissions.getRepoPath();
List<Privilege> privileges = getPrivileges();
Subject subject = getSubject();
boolean isAllowedTo = isAllowedTo(ADMIN, DELETE, DEPLOY, ANNOTATE, READ);
}
PermissionTarget permissionTarget = artifactory.security().permissionTarget("permissionName");
String name = permissionTarget.getName());
String exclude = permissionTarget.getExcludesPattern();
String include = permissionTarget.getIncludesPattern();
List<String> repos = permissionTarget.getRepositories();
List<ItemPermission> perm = permissionTarget.getItemPermissions();
List<String> permissionTargetNames = artifactory.security().permissionTargets();
for (String permissionTargetName : permissionTargetNames) {
PermissionTarget permissionTarget = artifactory.security().permissionTarget(permissionTargetName);
}
Principal userAdmin = artifactory.security().builders().principalBuilder()
.name("admin")
.privileges(Privilege.ADMIN)
.build();
Principal groupTest = artifactory.security().builders().principalBuilder()
.name("myTest")
.privileges(Privilege.DEPLOY, Privilege.READ)
.build();
Principals principals = artifactory.security().builders().principalsBuilder()
.users(userAdmin)
.groups(groupTest)
.build();
PermissionTarget permissionTarget = artifactory.security().builders().permissionTargetBuilder()
.name("myPermission")
.principals(principals)
.repositories("some-repository")
.includesPattern("com/company/**,org/public/**")
.build();
artifactory.security().createOrReplacePermissionTarget(permissionTarget);
Version version = artifactory.system().version();
String version = version.getVersion();
String revision = version.getRevision();
String license = version.getLicense();
List<String> addons = version.getAddons();
String xml = artifactory.system().configuration();
String xml = ...
artifactory.system().configuration(xml);
Executing an Artifactory REST API
ArtifactoryRequest repositoryRequest = new ArtifactoryRequestImpl().apiUrl("api/repositories")
.method(ArtifactoryRequest.Method.GET)
.responseType(ArtifactoryRequest.ContentType.JSON);
List<String> response = artifactory.restCall(repositoryRequest);
The code is built using Gradle and includes integration tests. If you'd like to build the code without tests, run:
> gradle clean build -x test
Please follow these steps to build and test the code:
- Startup an Artifactory-Pro instance.
- Set the CLIENTTESTS_ARTIFACTORY_URL, CLIENTTESTS_ARTIFACTORY_USERNAME and CLIENTTESTS_ARTIFACTORY_PASSWORD environment variables with your Artifactory URL, username and password.
- Run:
> gradle clean build
We welcome community contribution through pull requests.
This client is available under the Apache License, Version 2.0.
(c) All rights reserved JFrog