<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1990156302547833748</id><updated>2012-05-22T15:50:05.677+03:00</updated><category term='promotion'/><category term='gradle'/><category term='Yoav Landman'/><category term='continuous integration'/><category term='nuget'/><category term='ivy'/><category term='build'/><category term='artifactory'/><category term='seminars'/><category term='javaone'/><category term='JFrog'/><category term='jenkins'/><category term='QCon'/><category term='best practices'/><category term='Noam Tenne'/><category term='UI'/><category term='.net'/><category term='maven'/><category term='Fred Simon'/><category term='staging'/><category term='JBaruch'/><category term='hudson'/><category term='release management'/><category term='Diego Pacheco'/><title type='text'>From the Frog's Mouth</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yoav Landman</name><uri>http://www.blogger.com/profile/04609544830985043196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_a5tMhAMGeN0/S458ju-vC9I/AAAAAAAAAGc/tctBm9XFIjI/S220/yoav.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-8000752091650640563</id><published>2012-04-12T18:13:00.000+03:00</published><updated>2012-04-12T18:13:53.418+03:00</updated><title type='text'>JFrog jumps at Devops opportunity with continuous integration repository</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-6ZNLZ4URyZ4/T4bs5UrFJuI/AAAAAAAAAEU/O4UV6uFzhqk/s1600/451.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://4.bp.blogspot.com/-6ZNLZ4URyZ4/T4bs5UrFJuI/AAAAAAAAAEU/O4UV6uFzhqk/s200/451.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Analyst:&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;&amp;nbsp;&lt;a href="https://www.451research.com/biography?eid=301" style="color: #1155cc;" target="_blank"&gt;Jay Lyman&lt;/a&gt;&amp;nbsp;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif;"&gt;Israel-based &lt;a href="http://www.jfrog.com/" target="_blank"&gt;&lt;b&gt;JFrog &lt;/b&gt;&lt;/a&gt;backs the open source &lt;a href="http://www.jfrog.com/products.php" target="_blank"&gt;&lt;b&gt;Artifactory &lt;/b&gt;&lt;/a&gt;repository management software, where it finds audience with both application developers and IT operations teams.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="background-color: white; font-family: Arial, sans-serif;"&gt;Its positioning between these two parties managing one of their common challenges in software artifacts and binaries places JFrog at the crux of the devops trend that is pulling development and IT operations together. While its Artifactory software and repository management remain somewhat unique in the industry, we see a growing list of competing vendors and categories, particularly as more development and operations center on cloud computing.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #222222; font-size: 13px;"&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif;"&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;The 451&amp;nbsp;Take&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog and its repository management software benefit from their unique position at the crossroads of software developers and IT operations, or dev! ops, where the two come together primarily for speed and efficiency. JFrog's early all-in bet on the Jenkins continuous integration server, a fork of the Oracle-owned Hudson, appears to be paying off as the market continues to favor Jenkins. Looking ahead, it will be critical for JFrog to differentiate itself as other vendors and categories cross more over into competition. Also key will be JFrog's ability to integrate and grow with PaaS offerings in the market, but we expect we will see the company consistently here.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Context&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog, based in Netanya, Israel, backs the Artifactory binary repository management software, which is open source under the LGPLv3 license. The company was founded in 2008 by its current CEO Shlomi Ben Haim, its current CTO Yoav Landman and current Chief Architect Frederic Simon, all of whom haved worked in the Java and open source communities together. JFrog has about 16 employees, most of whom are engineers, and plans to have a h! eadcount of about 40 by the end of 2012. The company launched ! its first paid product Artifactory Pro at the end of 2009, starting with some key, large customers including LinkedIn and Netflix. Today, JFrog reports almost 250 paying customers and its binary repository management software running on the same number of servers. JFrog says it is currently considering venture capital investment options, but is well funded from its own income and angel investment from its launch.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Products&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog's Artifactory product manages binary repositories as software moves through development to testing and quality-assurance and eventually to deployment. The software sits as a proxy between other development tools used in managing software repositories and continous integration, such as Apache Ant and &lt;b&gt;Maven &lt;/b&gt;build automation, &lt;b&gt;Ivy &lt;/b&gt;dependency manager and &lt;b&gt;Gradle &lt;/b&gt;project automation. Artifactory caches software artifacts so repeated downloading is not necessary. Artifactory also blocks unwanted or external requests for internal repository artif! acts, controlling how, where and by whom artifacts are deployed. This helps to manage artifacts and third-party dependencies used by developes and IT operations, which can also share repositories among different departments or teams using Artifactory. The Artifactory software itself is built on the Java Content Repository, which helps support high concurrency and data integrity, the company says. Artifactory's underlying storage, which is backup ready, also supports the attachment of searchable XML metadata and user-defined properties via JFrog's OpenMetadata technology. The software features granular permission controls that can be managed through a simple UI.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog offers its Artifactory repository management software in two versions, &lt;b&gt;&lt;a href="http://www.jfrog.com/pro-features.php" target="_blank"&gt;Pro&lt;/a&gt; &lt;/b&gt;and &lt;a href="https://secure.artifactoryonline.com/registration/registration.html?0" target="_blank"&gt;&lt;b&gt;Cloud&lt;/b&gt;&lt;/a&gt;. Artifactory Pro is an annual subscription that includes a set of paid add-ons bundled with the open source software. The Pro version, priced at $2,350 per year, includes updates, full maintenance and bug fixes as well as a growing list of add-ons for continuous integration server support, resource management, license control, search and other capabilities that go along with the repository management. The cloud version, &lt;b&gt;Artifactory Online&lt;/b&gt;, is the same offering in SaaS form with SLA support. Users can quickly set up private repositories using the service without the typical requirements of configuring and customizing a server and access.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;The newest version of the software, Artifactory 2.6, is expected in the second quarter of 2012 and is focused on customizable release management. Much of this centers on extending Artifactory management beyond pre-staging to encompass more of the software release process. The idea is to speed the time between software testing and release by maintaining consistency and manageability of software repositories.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Technology&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog reports that the use and proliferation of cloud computing has resulted in an enterprise software release process that requires the management of software binaries and repositories much earlier in the effort. This coincides with the trend of devops, which demands that developers and IT operations work closer together and consider each others' roles and responsibilities more thoughtfully. JFrog says that while binaries are closely tracked through testing and QA phases, they can quickly get lost once code hits production. Thus, Artifactory i! s aimed at supporting that move of software to production. JFrog says it is gaining traction with Artifactory Online because of a move by major players, including &lt;a href="http://repo.springsource.org/" target="_blank"&gt;&lt;b&gt;SpringSource&lt;/b&gt;&lt;/a&gt;, to put more of their development and support in the cloud.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Artifactory also integrates with a key devops technology: continous integration servers, including &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Bamboo+Artifactory+Plug-in" target="_blank"&gt;&lt;b&gt;Bamboo &lt;/b&gt;&lt;/a&gt;, &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/TeamCity+Artifactory+Plug-in" target="_blank"&gt;&lt;b&gt;TeamCity&amp;nbsp;&lt;/b&gt;&lt;/a&gt;and &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Artifactory+Plugin" target="_blank"&gt;&lt;b&gt;Jenkins&lt;/b&gt;&lt;/a&gt;. JFrog is also benefiting from its decision to support Jenkins, which is a fork of the Hudson continuous integration server from Oracle. While we saw the market supporting both servers last year, it appears there is more momentum and vitality for Jenkins currently and this appears to be contributing to traction for JFrog.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Another part of JFrog's current growth centers on its focus on application programming interfaces (APIs), which have emerged as critical for promoting communities around connectors and plug-ins. JFrog stresses the importance of giving its users and customers a stable, documented API along with examples. JFrog also highlights that APIs are a sort of common language between software developers and IT operations teams, which both work closely with APIs to make things work.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Finally, JFrog is also adding more support for .Net and the Windows world, particularly with its recently-added support for &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/NuGet+Repositories" target="_blank"&gt;&lt;b&gt;NuGet&lt;/b&gt;&lt;/a&gt;, a .Net package manager. Through an add-on, Artifactory can support and proxy NuGet packages for Visual Studio .Net applications. This is significant as we see .Net and Windows catching up in devops after trailing to mostly Linux and open source programming frameworks and languages the previous few years.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Integrations and partnership&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Artifactory is commonly deployed alongside other key devops technologies, including the continuous integration servers such as Bamboo and Jenkins as well as server automation frameworks such as Chef and Puppet. The Artifactory software also works with a range of other development tools in dependency management, build and project automation and other areas. JFrog also partners with &lt;a href="http://www.cloudbees.com/platform-ecosystem.cb" target="_blank"&gt;&lt;b&gt;CloudBees&lt;/b&gt;&lt;/a&gt;, a PaaS provider that is centered on the Jenkins CI server.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Competition&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Its work in Java and Apach! e means that JFrog is competing mostly with Sonatype, backer of the Apache Maven and its own Nexus repository management software. While JFrog supported the Jenkins fork of the Hudson CI server last year, Sonatype remained supportive of Hudson. This continues to be the case today and while the market does seem to be favoring Jenkins, the fact that Oracle still backs Hudson may intensify the competition from Sonatype. Another category of competitors comes from the code vetting and management world, where vendors such as Black Duck continue to extend further into the development process. Other competitors here include OpenLogic, Palamida and Protecode. Another area that may represent more competition for JFrog going forward is cloud monitoring and management. For example, Electric Cloud is a cloud automation and devops vendor that includes artifact management in its offerings. JFrog must also compete with use of other open source software for repository management, such as th! e Apache Archiva repository manager.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;SWOT Analysis&lt;/span&gt;&lt;/h4&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif; margin-bottom: 15pt; margin-right: 24.75pt;"&gt;&lt;div style="border-bottom-color: rgb(199, 199, 199); border-bottom-style: solid; border-bottom-width: 1pt; border-color: initial; border-image: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: #e5eff6; background-image: initial; background-origin: initial; margin-bottom: 3.75pt;"&gt;&lt;b&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Strengths&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;JFrog and its Artifactory repository management software sit at the crux of the growing devops trend in its technology and support for both software developers and IT operations.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif; margin-bottom: 15pt; margin-right: 24.75pt;"&gt;&lt;div style="border-bottom-color: rgb(199, 199, 199); border-bottom-style: solid; border-bottom-width: 1pt; border-color: initial; border-image: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: #e5eff6; background-image: initial; background-origin: initial; margin-bottom: 3.75pt;"&gt;&lt;b&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Weaknesses&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;The company remains somewhat obscure and is lesser known than other vendors in the small but growing devops space.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif; margin-bottom: 15pt; margin-right: 24.75pt;"&gt;&lt;div style="border-bottom-color: rgb(199, 199, 199); border-bottom-style: solid; border-bottom-width: 1pt; border-color: initial; border-image: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: #e5eff6; background-image: initial; background-origin: initial; margin-bottom: 3.75pt;"&gt;&lt;b&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Opportunities&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;The growth of devops practices and processes among both newer, Web 2.0 type users and more mainstream enterprises could provide more than enough fuel for JFrog's growth.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif; margin-bottom: 15pt; margin-right: 24.75pt;"&gt;&lt;div style="border-bottom-color: rgb(199, 199, 199); border-bottom-style: solid; border-bottom-width: 1pt; border-color: initial; border-image: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; padding-top: 0cm;"&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: #e5eff6; background-image: initial; background-origin: initial; margin-bottom: 3.75pt;"&gt;&lt;b&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Threats&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span style="font-family: Arial, sans-serif;"&gt;Other vendors, particularly those dealing with software development and deployment in the cloud, are increasingly offering similar repository managemenet features and capabilities.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: rgba(255, 255, 255, 0.917969); font-family: arial, sans-serif;"&gt;&lt;div class="MsoNormal" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-8000752091650640563?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/8000752091650640563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2012/04/jfrog-jumps-at-devops-opportunity-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8000752091650640563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8000752091650640563'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2012/04/jfrog-jumps-at-devops-opportunity-with.html' title='JFrog jumps at Devops opportunity with continuous integration repository'/><author><name>Shlomi</name><uri>http://www.blogger.com/profile/07760000963164931009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-6ZNLZ4URyZ4/T4bs5UrFJuI/AAAAAAAAAEU/O4UV6uFzhqk/s72-c/451.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-4814503085533780825</id><published>2012-03-16T09:06:00.000+02:00</published><updated>2012-03-16T09:38:34.814+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFrog'/><category scheme='http://www.blogger.com/atom/ns#' term='QCon'/><category scheme='http://www.blogger.com/atom/ns#' term='JBaruch'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='seminars'/><title type='text'>QCon 2012 - Perfect as Everything in London Should Be</title><content type='html'>It was &lt;a href="http://www.jfrog.com/"&gt;JFrog&lt;/a&gt;'s second QCon London, and it just gets better. Imagine: even the London weather was perfect, not to mention the sessions, booth traffic, show organization and food (what, you say, good English food? Well, great IndoPak food, at least). Due to high demand by sponsors, the exhibition took place on two floors (as opposed to one floor last year). Our JFrog booth was located in the same place as in 2011. We’re getting used to the place and are looking forward to returning next March!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://qconlondon.com/dl/qcon-london-2012/web/photo/Londonview600x294.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://qconlondon.com/dl/qcon-london-2012/web/photo/Londonview600x294.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The speaker panel was extremely impressive, featuring gurus like Martin Fowler, Adrian Cockcroft (the man behind Netflix’ cloud), Dwight Merriman (co-creator of MongoDB), Damien Katz (creator of CouchDB) and Rich Hickey (creator of Clojure).&lt;br /&gt;&lt;br /&gt;The conference started with two training days - six full-day tutorials each. From my perspective, the most interesting two tutorials were “&lt;a href="http://qconlondon.com/london-2012/presentation/Cloud%20Architecture"&gt;Cloud Architecture&lt;/a&gt;” by Adrian Cockcroft, where he shared the architecture, best practices and decisions behind Netflix’ cloud (which Artifactory is proud to be a part of) and “&lt;a href="http://qconlondon.com/london-2012/presentation/Continuous%20Delivery%20-%20SOLD%20OUT"&gt;Continuous Delivery&lt;/a&gt;” by ThoughtWorks’ Tom Sulston (that’s as close to the roots of the famous &lt;a href="http://www.amazon.com/gp/product/0321601912"&gt;“Continuous Delivery” book&lt;/a&gt; as you can get). For me, the most fascinating thing in the Continuous Delivery process as ThoughtWorks sees it, is that its virtues are exactly the same as we based our &lt;a href="http://qconlondon.com/london-2012/presentation/Cloud%20Architecture"&gt;Artifactory&lt;/a&gt; upon back in 2006: DevOps automation and rapid release cycle. We appreciated the validation of our concept.&lt;br /&gt;&lt;br /&gt;The remaining three days of the week were all-day sessions. It’s impossible to review such a significant number of talks in one blog post, so I’ll concentrate only on the excellent keynote addresses (with one exception).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qconlondon.com/london-2012/presentation/The%20Data%20Panorama"&gt;Martin’s conference-opening keynote speech&lt;/a&gt; was about data. The main feature of modern data is that it is bigger than you think. Polyglot storage in general and various kinds of NoSQL look like the right solution.&lt;br /&gt;&lt;br /&gt;My favorite keynotes are usually the evening ones. A beer in your hand makes any amusing talk even more enjoyable. One named “&lt;a href="http://qconlondon.com/london-2012/presentation/Developers%20Have%20a%20Mental%20Disorder"&gt;Developers Have a Mental Disorder&lt;/a&gt;” I couldn’t miss! Greg Young gave a great show, funny and entertaining, about serious dilemmas in software development that we, the developers, prefer to ignore. The brightest example, of course is the downside of DRY (did you ever think about one?). By removing duplication, we increase coupling, which can be much worse.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qconlondon.com/london-2012/presentation/Simple%20Made%20Easy"&gt;Thursday morning’s keynote address &lt;/a&gt;was delivered by Rich Hickey. He spoke about the differences between “Simple” and “Easy”. Sounds pretty similar, but in fact they are very far from being the same. Antonyms to the rescue: simple vs. complex, while easy vs. hard. Now it’s clear - we need to strive to prevent and remove complexity (go simple) without being afraid of the hard. Choosing easiness may end up creating complexity. Things which are easy, but complex, include OOP, mutable state, imperative loops and frameworks (especially ORM). Things which are simple, but not necessarily easy (at least not until you get them), are LISP-ish languages, like Clojure.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-ash4/419636_10150618059748962_751098961_9180344_430460510_n.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-ash4/419636_10150618059748962_751098961_9180344_430460510_n.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://qconlondon.com/london-2012/presentation/Build%20Trust%20in%20Your%20Build%20to%20Deployment%20Flow!"&gt;My session&lt;/a&gt; also took place on Thursday, in relatively small room, about 70 people. I was more than happy to see that it was almost packed. I spoke about building trust in your build process by selecting the right tools for the job (of course, we consider Artifactory as one). I also spoke about the problems of DevOps in the word of Continuous Delivery in the cloud and the rapid release cycle of SaaS applications. I stressed the huge timeshare of binaries in ALM process and the importance of using a tool that really understands binaries to deal with them. That’s exactly the reason why we developed Artifactory.&lt;br /&gt;&lt;br /&gt;Half of my session was dedicated to live demos, which went smoothly, incredible as it may sound. According to the feedback received, my talk was well accepted, and hopefully will be useful to some of the attendants for building easier and more reliable release processes. The Q&amp;amp;A session continued at our booth, where we repeatedly did live demonstrations and received excellent feedback each time. If you want to get a feeling of my talk,&amp;nbsp;&lt;a href="http://www.slideshare.net/jbaruch/build-trust-in-your-buildtodeployment-flow"&gt;here’s the slide-deck&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Friday was the last day of the conference. It started hard with a highly technical keynote address by John Allspaw with a scary name: “&lt;a href="http://qconlondon.com/london-2012/presentation/Resilient%20Response%20In%20Complex%20Systems"&gt;Resilient Response In Complex Systems&lt;/a&gt;”. For someone like me, who doesn’t deal on a daily basis with Disaster Recovery, the session was astonishing. Looking behind the curtain of that kitchen reveals a totally different way of thinking and planning. It may be how individuals and teams have to perform during a disaster (e.g. personal heroism is bad even if successful; it sends the wrong message to the team), or simulating disasters on live production systems (I never could even dare to think about that). The most obvious, but still eye-opening advice that John gave is to learn from successes, not only from failures. It can give us a lot of information and happens much more frequently, no? The only organization with which I am familiar that embraces that technique is the Israeli Air Force.&lt;br /&gt;&lt;br /&gt;To sum up, the conference was great by every measure: technical sessions, attendance,  networking, Artifactory exposure, and after-show quality time. Thank you, InfoQ, for this wonderful event in London. QCon was a great starting shot for JFrog’s “&lt;a href="https://www.facebook.com/artifrog/posts/264469456952764"&gt;Busy March&lt;/a&gt;”. You still can catch Fredric and Yoav giving talks on various events in US and Europe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-4814503085533780825?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/4814503085533780825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2012/03/qcon-2012-perfect-as-everything-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/4814503085533780825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/4814503085533780825'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2012/03/qcon-2012-perfect-as-everything-in.html' title='QCon 2012 - Perfect as Everything in London Should Be'/><author><name>Baruch Sadogursky</name><uri>https://profiles.google.com/112280655076209917443</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-E3PXRhF9h-M/AAAAAAAAAAI/AAAAAAAAABM/BMj63oLc6nE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-8050453764839629117</id><published>2012-02-06T13:29:00.000+02:00</published><updated>2012-02-12T17:35:27.649+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFrog'/><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='nuget'/><category scheme='http://www.blogger.com/atom/ns#' term='JBaruch'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Dependency Management with .NET - Doing it Right</title><content type='html'>The problem of dependency management is neither new nor original, it  exists in all development platforms, and .NET is no different.&lt;br /&gt;Let’s go through different solutions and see how they perform. I’ll list them here in no particular order.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Keeping dependencies in your source control&lt;/span&gt;&lt;br /&gt;That’s a very popular solution, and for a reason. The benefits are obvious. Here are some of them:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No setup. You already have your source control in place (hm, I hope you do!). Add \bin directory, and you are fine.&lt;/li&gt;&lt;li&gt;No learning curve. Developers are used to work with source control.&lt;/li&gt;&lt;li&gt;Shared. The whole team gets changes and updates from the server as they occur.&lt;/li&gt;&lt;li&gt;Enterprisy (in a good way). The software is proven, backed up, DRP is done.&lt;/li&gt;&lt;/ul&gt;Sounds  good, doesn’t it? So, what’s wrong with it? Only one thing - source  control systems are designed to control, well, sources. As such they  aren’t so great in controlling binaries. These are the shortcomings we  all encountered during the years of Version Control System usage for  dependencies:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It isn’t a proxy. VCS can’t download the  dependency you need from a central repository when you need one. You  need to manually download it and add it to VCS. The history starts from  there - you just lost the &amp;nbsp;link to the original file. So, you work hard,  and on top of it lost information; this repeat itself for each new  dependency.&lt;/li&gt;&lt;li&gt;Versioning mismatch. Source files are versioned by  their content. VCSs know how to diff them and understand what changed.  Binaries, on the other side, usually versioned by their name. From VCS  point of view they are different entries, each one without any version  history.&lt;/li&gt;&lt;li&gt;Some very popular VCSs (like Subversion) can’t  obliterate files. That means - once a file was added, it stay in the  repository forever. That’s not a big issue for small source files, but  can become quite a pain when it comes to obsolete large binaries.&lt;/li&gt;&lt;li&gt;Source  control knows how to search sources. And, of course, the most important  type of search is by content. Searching for binaries is different: what  matters there is the location, structure of the file name and, in case  of archived artifact, the contents of archive.&lt;/li&gt;&lt;li&gt;The permissions  scheme of VCSs is tailored for versioning sources (again!). For example,  there is no override permission. That’s because overriding sources is  something we do all the time (that’s what diff is for in VCS) - it’s the  same security level as, let's say, adding a new source file. With  binaries the situation is very different. While adding new binaries is  fine, overriding released binary is something that shouldn’t be done,  one should have a special permission for it.&lt;/li&gt;&lt;li&gt;Distributed VCSs,  awesome by themselves, are particularly unsuited for handling big binary  files. When cloning a remote repository to your machine &lt;a data-mce-href="https://twitter.com/#%21/hlship/status/111143638163132417" href="https://twitter.com/#%21/hlship/status/111143638163132417"&gt;you are bringing all the history of all the files in it&lt;/a&gt;. Now just think about all the huge binaries sitting there...&lt;/li&gt;&lt;/ul&gt;As you see, the conclusion is simple - we can do better. Let’s try something specialized for binaries. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;GAC and WebGAC&lt;/span&gt;&lt;br /&gt;Global  Assembly Cache is, on contradictory to VCS ,tailored for storing  binaries. It understands versions, prevents conflicts, and&amp;nbsp;generally  does a good job being your local dependencies storage. The main problem  with GAC is being local, which means - each and every developer should  take the binaries from somewhere and install them in their local GAC.  You see the troubles coming in that setup, don’t you? &lt;a data-mce-href="http://www.lshift.net/blog/2010/02/27/webgac-minding-your-net-dependencies" href="http://www.lshift.net/blog/2010/02/27/webgac-minding-your-net-dependencies"&gt;WebGAC&lt;/a&gt; to the rescue here.&amp;nbsp;It's essentially GAC shared by WebDAV and enables  clients to fetch dependencies from the server, simplifying dependencies  management for a team. Let’s do our pros/cons math. The benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GAC is good, standard and proven solution for binaries management. It deals well with versions.&lt;/li&gt;&lt;li&gt;WebGAC is a central binaries repository for a team. Every team member synchronizes with it.&lt;/li&gt;&lt;li&gt;WebDAV  is popular well-known HTTP extension with locking, security management,  etc. Working with the Apache WebDAV module is generally  straightforward.&lt;/li&gt;&lt;/ul&gt;Let’s see what won’t work so great with that solution:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It  isn’t a proxy. WebGAC can’t download the dependency you need from a  central repository when you need one. You need to manually download it,  add it to WebGAC and only then it becomes available to the team.&amp;nbsp;Not  only must you work for every version of every dependency needed, the  link to the original file is lost.&lt;/li&gt;&lt;li&gt;No notion of packages. GAC  contains single dlls. You install them one by one. But think about  NUnit, as an example. It contains about dozen of dlls along with various  xml and configuration files. How can you install it to GAC?&lt;/li&gt;&lt;li&gt;Security  is cumbersome. You’ll need to configure Apache Server’s security, and  even then it won’t be flexible enough to determine between deployer (a  user that can publish private dependencies) and promoter (a user that  can move dependencies from a private repository to a public one).&lt;/li&gt;&lt;li&gt;Search  is basic. WebDAV by itself only knows about files. It doesn’t care  about the structure of the filename, or about the presence of Strong  Names.&lt;/li&gt;&lt;/ul&gt;Looks like we still didn’t find what we are looking for, and then...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Here comes NuGet &lt;/span&gt;&lt;br /&gt;This is something else. &lt;a data-mce-href="http://nuget.codeplex.com/" href="http://nuget.codeplex.com/"&gt;NuGet&lt;/a&gt; designed to be “a developer focused package management system for the  .NET platform intent on simplifying the process of incorporating  third-party libraries into a .NET application during development”.  That’s exactly what we need. Let’s look how great it is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Manages packages, not dlls.&lt;/li&gt;&lt;li&gt;Provides &lt;a data-mce-href="http://nuget.org/packages" href="http://nuget.org/packages"&gt;NuGet Gallery&lt;/a&gt; - almost 4.5K (at the time of writing) packages are at your disposal for all your development needs.&lt;/li&gt;&lt;li&gt;Supports binary versioning.&lt;/li&gt;&lt;li&gt;Integrates with Visual Studio.&lt;/li&gt;&lt;li&gt;Integrates with your build.&lt;/li&gt;&lt;li&gt;Integrates with your build server (only &lt;a data-mce-href="http://blogs.jetbrains.com/dotnet/2011/08/native-nuget-support-in-teamcity/" href="http://blogs.jetbrains.com/dotnet/2011/08/native-nuget-support-in-teamcity/"&gt;TeamCity&lt;/a&gt; at the moment of writing).&lt;/li&gt;&lt;/ul&gt;This  tool's like a dream come true. So, what can I mention as downsides?  Most of them are downsides of the NuGet Gallery, not NuGet itself. The  Gallery is a young and relatively small project (just for the sake of  comparison, Maven Central is 6 years old and contains more than 290K  artifacts) and, as such, it has its downsides:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The content of  submissions to the Gallery is (almost) unverified. Everyone can  register, get the API key and start uploading whatever they like. Scary,  isn't it? (yes, very scary).&lt;/li&gt;&lt;li&gt;Being public, NuGet Gallery can’t be used for inter-team packages exchange. &lt;a data-mce-href="http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds#Creating_Remote_Feeds" href="http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds#Creating_Remote_Feeds"&gt;Private Remote Feeds&lt;/a&gt; are the recommended solution. Next we'll see if it is good enough.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&lt;span style="font-size: large;"&gt;Working with NuGet Remote Feeds &lt;/span&gt;&lt;br /&gt;&lt;a data-mce-href="http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds#Creating_Remote_Feeds" href="http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds#Creating_Remote_Feeds"&gt;Remote Feeds&lt;/a&gt;,  introduced in NuGet 1.4 are crucial need for any development team. It  serves a dual purpose: it allows sharing 3rd party packages that aren’t  available on Gallery (or even replaces the Gallery for those who can’t  trust it) and it serves as a target for internal deployments - both for  team collaboration and for other usages, as making packages available to  QA, or even serving them to the customers from the outside world (by  using &lt;a data-mce-href="http://chocolatey.org/" href="http://chocolatey.org/"&gt;Chocolatey&lt;/a&gt;, for example). If that’s so right, what’s wrong? Here’s what:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You saw it coming: It isn’t a proxy. You know the score by now.&lt;/li&gt;&lt;li&gt;It  can’t aggregate. The NuGet Remote Feed exposing one monolithic  repository: the one you have on your machine. It can’t aggregate NuGet  packages from remote repositories, or expose number of local  repositories (separated for security reasons, for example).&lt;/li&gt;&lt;li&gt;You  can’t attach your own metadata. Let’s say you want to annotate some  package with compatibility information (e.g. works with certain  browsers). No, can’t do.&lt;/li&gt;&lt;li&gt;The repository is very simplistic. It  doesn’t provide any web interface; it browsable and searchable only from  a client - be it Visual Studio or the command line interface (pretty  basic by itself).&lt;/li&gt;&lt;li&gt;Even the VS search interface is very basic  (all you have is arbitrary sorting and free text search). It should be  enough for starters but lack of searching inside the packages or by  properties (from the previous bullet) will bite you eventually.&lt;/li&gt;&lt;li&gt;The  security scheme is even less than simplistic. All that's required to  authenticate a deployment/delete of all the users at once is an API key.  What about separation of duties? Some users should only be able to  read, others only to annotate with metadata (QA team that tests  compatibility in my previous example), and only small subgroup - to  deploy. &amp;nbsp;The all-or-nothing scheme is definitely insufficient.&lt;/li&gt;&lt;li&gt;Storage format is suboptimal:&lt;ul&gt;&lt;li&gt;The  packages are stored on the filesystem in a naive simple format. That  fine for small repository,but as you grow, you'd expect storage which  more optimized for binaries.&lt;/li&gt;&lt;li&gt;The metadata is not indexed. Again, fine for small repo, troubles are foreseen when it comes to scaling.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;So, is there a good alternative to NuGet Remote Feed to be your in-house Gallery for NuGet packages? We, the proud makers of &lt;a data-mce-href="http://www.jfrog.com/" href="http://www.jfrog.com/"&gt;Artifactory&lt;/a&gt;, &amp;nbsp;believe there is:&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Meet Artifactory&lt;/span&gt;&lt;br /&gt;&lt;a data-mce-href="http://www.jfrog.com/" href="http://www.jfrog.com/" id="internal-source-marker_0.8537193675811334"&gt;Artifactory&lt;/a&gt; is an enterprise-grade Binary Repository that centralizes all aspects  of managing software binaries. That means that we tackle all the  problems mentioned above. We are developing Artifactory since 2006.  Being used by millions of users for storing, sharing and managing  binaries, we have gathered great feedback from our users.&lt;br /&gt;That's what we've learned:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Binary packages are different from sources (by being big and binary) and deserve smart storage.&lt;/li&gt;&lt;li&gt;Binary  packages are usually archives (be it jars, zips, rpms or nupkgs). They  should be browsable and searchable without the need to download them  locally to developer's machine.&lt;/li&gt;&lt;li&gt;Big public repositories exist on the net, they need to be proxied smartly (variations, auditing, managing)&lt;/li&gt;&lt;li&gt;Users  come in different flavors. Their permissions should match possible  responsibilities (and in the case of binary packages they are different  from other cases).&lt;/li&gt;&lt;li&gt;A binary repository&amp;nbsp;holds critical information, it should be rock-solid, backed up, and DRP ready.&lt;/li&gt;&lt;li&gt;Your software ends up being a package. We know how to help you...&lt;ul&gt;&lt;li&gt;build it in a reproducible manner, integrating with your build tools and your build server.&lt;/li&gt;&lt;li&gt;stage it to ensure the best quality.&lt;/li&gt;&lt;li&gt;distribute it to your customers.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;You get the gist behind&amp;nbsp;Artifactory by watching &lt;a href="http://www.youtube.com/watch?v=aa4YBDUDWy0"&gt;this 2.5 minutes YouTube video&lt;/a&gt;. If you’re not in the mood for movies (or ran out of popcorn), here’s quick recap (click on the image for full size):  &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LiKqS0Tz6KM/Ty-1Ppg6FOI/AAAAAAAAAB0/G105GWAM9VY/s1600/NuGet+poxy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://2.bp.blogspot.com/-LiKqS0Tz6KM/Ty-1Ppg6FOI/AAAAAAAAAB0/G105GWAM9VY/s400/NuGet+poxy.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you see, instead of working with a number of NuGet Feeds (NuGet  Gallery, Orchard Gallery, &amp;nbsp;Remote Feeds from co-workers and from  different teams) developers work with exactly one repository. It  simplifies setup and daily work and centralizes management and  maintenance.&lt;br /&gt;The work is bi-directional, the users resolve their 3rd  party dependencies from Artifactory and deploy their created packaged  into it.&lt;br /&gt;Now let’s add a build server to the picture (literally):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SK552bO7O0w/Ty-1cX80URI/AAAAAAAAACE/_Jo1VWfFC5I/s1600/NuGet+Build.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://1.bp.blogspot.com/-SK552bO7O0w/Ty-1cX80URI/AAAAAAAAACE/_Jo1VWfFC5I/s400/NuGet+Build.png" style="cursor: move;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Yup, with numbers this time. So, here we go (click on the image for full size):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Developers  find and &amp;nbsp;fetch new 3rd party packages from Artifactory in Visual  Studio. The packages are downloaded from Artifactory to the developer's  machine. If the packages aren’t present in Artifactory it will look for  them in remote galleries/feeds. On developer machines &lt;code&gt;packages.config&lt;/code&gt; is updated with the list of used packages.&lt;/li&gt;&lt;li&gt;Developers commit their code and &lt;code&gt;packages.config&lt;/code&gt; (but not the binaries) to VCS.&lt;/li&gt;&lt;li&gt;The Build server (as I already mentioned, &lt;a data-mce-href="http://blogs.jetbrains.com/dotnet/2011/08/native-nuget-support-in-teamcity/" href="http://blogs.jetbrains.com/dotnet/2011/08/native-nuget-support-in-teamcity/"&gt;TeamCity&lt;/a&gt; now supports NuGet) takes the changes from the VCS.&lt;/li&gt;&lt;li&gt;It builds the solution and packs the produced artifacts as NuGet packages.&lt;/li&gt;&lt;li&gt;During  the build it fetches the needed packages from&amp;nbsp;Artifactory. If the  packages aren’t present in Artifactory it will look for them in remote  galleries/feeds.&lt;/li&gt;&lt;li&gt;Once the packages are built they are deployed to Artifactory.&lt;/li&gt;&lt;/ol&gt;Built  packages in Artifactory can be used by other teams (as their 3rd party  dependencies), by QA for running tests and even by the end users (&lt;a data-mce-href="http://chocolatey.org/" href="http://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; FTW), all this with fine-grained permissions and robust promotion  procedures (moving a package between repositories with different  visibility rules).&lt;br /&gt;You know what? It deserves dedicated how-to blog post. I’ll link it here once published.&lt;br /&gt;Assuming  you've read up to this point, you've gathered that starting from  Artifactory version&amp;nbsp;2.5.0 we are proud to serve the .NET world with full  NuGet support. We can proxy any remote NuGet feed (starting with NuGet  Gallery, of course), we can host the packages that aren’t found on any  remote NuGet feed, we can host the packages you produce and we can  aggregate any number of repositories of any kind under single a URL. We  provide you with an awesome UI for configuring your repositories,  browsing and searching for your packages. We also feature smart storage  that enables attaching searchable metadata on top of your binaries. We  can do it all on the cloud with our &lt;a data-mce-href="https://secure.artifactoryonline.com/art-online.php" href="https://secure.artifactoryonline.com/art-online.php"&gt;SAAS version&lt;/a&gt;.&lt;br /&gt;Hopefully , you're convinced by now and probably looking for the download link on our site&amp;nbsp;(&lt;a data-mce-href="https://secure.artifactoryonline.com/addons.php" href="https://secure.artifactoryonline.com/addons.php"&gt;here’s it&lt;/a&gt;, BTW, click on “Evalution”). If not, give it a try by playing with &lt;a data-mce-href="http://repo.jfrog.org/artifactory/webapp/browserepo.html?pathId=nuget-gallery-cache:" href="http://repo.jfrog.org/artifactory/webapp/browserepo.html?pathId=nuget-gallery-cache:"&gt;our live demo&lt;/a&gt;.  Look at the nuget-gallery cache: that’s how we proxy the NuGet Gallery.  You’ll find some of the packages saved locally; once you've selected a  package, you’ll see all kinds of information about it: its name and  size, who deployed it to Artifactory, where it came from (from NuGet  Gallery, naturally for this is the NuGet Gallery cache) and the  operations you can perform on this package (as anonymous the selection  is naturally limited). Clicking on the triangle in the tree will open  the package and let you dive into its content, including downloading  specific files from the archive:&lt;a data-mce-href="http://jbaruch.files.wordpress.com/2012/02/browse-nupkg.png" href="http://jbaruch.files.wordpress.com/2012/02/browse-nupkg.png"&gt;&lt;span id="goog_1878568905"&gt;&lt;/span&gt;&lt;span id="goog_1878568906"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rUcTVprCkf0/Ty-1XF2f4vI/AAAAAAAAAB8/kFAc6l7BJ9w/s1600/browse+nupkg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://4.bp.blogspot.com/-rUcTVprCkf0/Ty-1XF2f4vI/AAAAAAAAAB8/kFAc6l7BJ9w/s320/browse+nupkg.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;We,  at JFrog, believe that Artifactory is the missing piece of the puzzle  for a robust, agile .NET dependency management, which can make the  development process easier compared to other alternatives.&lt;br /&gt;We'll be  happy to receive any insights, thoughts and comments on the ideas  presented in this blog and/or your experience using Artifactory together  with NuGet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-8050453764839629117?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/8050453764839629117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2012/02/dependency-management-with-net-doing-it.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8050453764839629117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8050453764839629117'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2012/02/dependency-management-with-net-doing-it.html' title='Dependency Management with .NET - Doing it Right'/><author><name>Baruch Sadogursky</name><uri>https://profiles.google.com/112280655076209917443</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-E3PXRhF9h-M/AAAAAAAAAAI/AAAAAAAAABM/BMj63oLc6nE/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-LiKqS0Tz6KM/Ty-1Ppg6FOI/AAAAAAAAAB0/G105GWAM9VY/s72-c/NuGet+poxy.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-7952286992178721201</id><published>2011-11-01T15:51:00.000+02:00</published><updated>2011-11-01T15:51:43.699+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFrog'/><category scheme='http://www.blogger.com/atom/ns#' term='release management'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='ivy'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Artifactory - Community Talks</title><content type='html'>&lt;b&gt;We’d rather have our customers and users be the gauge of how well Artifactory met their Continuous Integration needs, rather than have you listen to our opinion.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;These are busy days for the froggers getting ready to release 2.4. &lt;br /&gt;The buzz is out there and proudly we can see more and more talks that cover Artifactory as part of their CI case-studies.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3JyNPPpFHIw/Tq_2IQfdNOI/AAAAAAAAACE/Lrvop7kayV4/s1600/2011%2BDukes%2BChoice%2BAward_clr.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="124" src="http://4.bp.blogspot.com/-3JyNPPpFHIw/Tq_2IQfdNOI/AAAAAAAAACE/Lrvop7kayV4/s200/2011%2BDukes%2BChoice%2BAward_clr.gif" width="156" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Following the &lt;a href="http://java.com/en/dukeschoice/index.jsp"&gt;DUKE CHOICE AWARDS&lt;/a&gt; in which Oracle honored us at JavaOne 2011 with the DUKE for "Innovative Tools for Developers", we would like to share with you these two great video presentations:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building for the Cloud&lt;/b&gt; - &lt;a href="http://javaposse.com/"&gt;Carl Quinn&lt;/a&gt; of &lt;a href="https://signup.netflix.com/MediaCenter"&gt;Neflix &lt;/a&gt;talks at &lt;a href="http://jz11.java.no/news.html"&gt;JavaZone&lt;/a&gt; and covers Netflix pipeline using Jenkins and Artifactory.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="128" src="http://player.vimeo.com/video/28795465?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/28795465"&gt;Building for the Cloud&lt;/a&gt; from &lt;a href="http://vimeo.com/javazone"&gt;JavaZone&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agile Application Lifecycle Management&lt;/b&gt; - Author of Agile ALM,&amp;nbsp;&lt;a href="http://michaelhuettermann.blogspot.com/"&gt;Michael Hüttermann&lt;/a&gt;, JavaOne talk. Michael describes how to execute an agile release management process using Jenkins, Artifactory and Maven. &lt;br /&gt;&lt;br /&gt;&lt;object height="400" width="850"&gt;&lt;param name="movie" value="http://www.parleys.com/dist/share/parleysshare.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="wmode" value="direct"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#222222"&gt;&lt;/param&gt;&lt;param name="flashVars" value="sv=true&amp;pageId=2666" &gt;&lt;/param&gt;&lt;embed src="http://www.parleys.com/dist/share/parleysshare.swf" type="application/x-shockwave-flash" flashVars="sv=true&amp;pageId=2666" allowfullscreen="true" bgcolor="#222222" width="400" height="188"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Enjoy Artifactory!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-7952286992178721201?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/7952286992178721201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/11/artifactory-community-talks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/7952286992178721201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/7952286992178721201'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/11/artifactory-community-talks.html' title='Artifactory - Community Talks'/><author><name>Shlomi</name><uri>http://www.blogger.com/profile/07760000963164931009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3JyNPPpFHIw/Tq_2IQfdNOI/AAAAAAAAACE/Lrvop7kayV4/s72-c/2011%2BDukes%2BChoice%2BAward_clr.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-3697199967934330022</id><published>2011-10-17T14:56:00.001+02:00</published><updated>2011-10-23T09:53:24.627+02:00</updated><title type='text'>The Frog Who Turned into a Prince</title><content type='html'>&lt;div style="background-color: transparent;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Fz9jzu27IlM/Tpwlkw-5jWI/AAAAAAAAAB4/GDCbylfkObU/s1600/2011-10-17_145409.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Fz9jzu27IlM/Tpwlkw-5jWI/AAAAAAAAAB4/GDCbylfkObU/s1600/2011-10-17_145409.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h1 dir="ltr" id="internal-source-marker_0.8846886532846838"&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;JFrog’s Artifactory Wins JavaOne 2011 Duke's Choice Award &lt;/span&gt;&lt;/h1&gt;&lt;div&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;3 years from the day it was founded, &lt;a href="http://www.jfrog.com/"&gt;JFrog &lt;/a&gt;was recognized by Oracle and the Java community &amp;nbsp;for Innovation Java Tools for Developer with Duke’s Choice Award at JavaOne 2011.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is not a marketing announcement nor a techie or an executive post, this blog is about how we felt the morning after we became Dukers’.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;It’s been more than a year since I posted “&lt;/span&gt;&lt;a href="http://java.dzone.com/articles/thats-what-community"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;That's what community for&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;”, I was sure that I felt the power of the open source community, and than came DUKE...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;It was Saturday around 2:00am, few weeks before JavaOne that I got the mail from Michelle Kovac of Oracle with the fantastic words “you're in the winners list right now for JFrog”. It took me 3 times to read the mail, and to actually hold the DUKE a few weeks later - to believe it!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;On Sunday evening, Oct. 2nd, at the JavaOne Open House, Oracle welcomed and celebrated the &lt;/span&gt;&lt;a href="http://java.com/en/dukeschoice/index.jsp"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;2011 Duke's Choice Award winners&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;, JFrog Artifactory was one of them. Together with 9 other innovative Java projects, we "&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;the froggers” stood there and felt like we got kissed and turned into a prince.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="background-color: white; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; font-weight: normal; white-space: normal;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/iCEvEJsZo5o/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/iCEvEJsZo5o&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/iCEvEJsZo5o&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;b&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Now, you might say - OK this guy took it a bit too far...&lt;/span&gt;&lt;/b&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;So Imagine &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;that you have been working like crazy for the last years (6 years since Yoav Landman, our CTO, first launched Artifactory and 3 years since we founded JFrog), your team beating any time-zone gap, and writing excellent code. You know that you are a game changer in the way people write code and you actually solve the developers pain, but still hear questions like: “So what is a Binary Repository Manager ?!” And “what do we need it for, if we use a version control ?!”&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Imagine &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;that during the last several years, you write open source based plug-ins to integrate with Artifactory’s ecosystem - &amp;nbsp;just to keep Artifactory “open” and to keep the freedom of choice in the developer’s hands, and you know that you are fighting giants with that approach.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Imagine &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;that you have been travelling all over the world “preaching” how your Continuous Integration process should look like and how you should build, deploy and distribute your software, and little by little you see followers doing as you advised.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;...and then, finally you got this huge hug from the community through Oracle.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I know its better to play the cool CEO, but JFrog is all about soul and I tell you it was (and still is) awesome!!! &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Fred Simon our Chief Architect tried to expressed that in the live &lt;/span&gt;&lt;a href="http://blogs.oracle.com/javaspotlight/entry/java_spotlight_episode_51_live"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;Java Spotlight podcast&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; - in 2 minutes talk, but we know it took much longer to come up to this point of recognition.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--hz6bONYPlA/Tpwk_je2AKI/AAAAAAAAABw/SD6l0rNOzyQ/s1600/dukers.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://2.bp.blogspot.com/--hz6bONYPlA/Tpwk_je2AKI/AAAAAAAAABw/SD6l0rNOzyQ/s320/dukers.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span id="internal-source-marker_0.8846886532846838" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;A week after JavaOne, we are back to ground and working hard to release Artifactory 2.4 with lots of improvements and new cool features like &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;P2 integration&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; to proxy and host all your Eclipse plugins via Artifactory and &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;YUM repository&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; for distributing RPMs directly from your Artifactory server acting as a fully-featured YUM repository.&lt;/span&gt;&lt;span style="background-color: yellow; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We got the DUKE CHOICE AWARD from Oracle and we are very honored and excited, but I keep remembering the words of one of the JUG’s leaders from the other night at the conference “&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;you’ve got a great tool and a great team - you deserve it&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;” - that’s more than a trophy, this is what we are here for, it’s our reward and we are grateful!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We are very pleased to receive this acknowledgement of our technological achievements by Oracle and the community. JFrog strives to provide our users and customers with advanced technology solutions that address their daily CI needs and driven by it. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I once wrote “community isn't a flock” now I know it for sure!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Thank you , Enjoy your build, Enjoy Artifactory.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;See you at JavaOne 2012. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;About JFrog:&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;JFrog is the home of Artifactory – world’s first Binaries Repository Management Solution. As the first company to provide the software market with a Repository Management Solution, JFrog has established itself as a technology leader in the industry and aspires to continue setting the standard moving forward.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;About Artifactory:&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div dir="ltr" style="margin-bottom: 0pt; margin-right: -38pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;With Artifactory, you can gain full control over all the build artifacts and third-party dependencies your organization uses and even share repositories throughout your interdepartmental and/or multi-team environment no matter where your team members may be located.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="margin-bottom: 0pt; margin-right: -38pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Built on top of the Java Content Repository (JCR), Artifactory supports extremely high concurrency and offers unmatched data integrity. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Artifactory is also tool that offers an open source, Pro and SaaS (cloud based) versions.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;More about the DUKE adventure at:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Times New Roman'; font-size: 10pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;a href="http://blogs.oracle.com/java/entry/and_the_winners_are_the"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;http://blogs.oracle.com/java/entry/and_the_winners_are_the&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;a href="http://www.youtube.com/watch?v=Lrq4UBGgQpg"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;http://www.youtube.com/watch?v=Lrq4UBGgQpg&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;&lt;a href="http://java.about.com/b/2011/10/06/dukes-choice-award-winners-2011.htm"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;http://java.about.com/b/2011/10/06/dukes-choice-award-winners-2011.htm&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-3697199967934330022?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/3697199967934330022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/10/frog-who-turned-into-prince.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/3697199967934330022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/3697199967934330022'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/10/frog-who-turned-into-prince.html' title='The Frog Who Turned into a Prince'/><author><name>Shlomi</name><uri>http://www.blogger.com/profile/07760000963164931009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Fz9jzu27IlM/Tpwlkw-5jWI/AAAAAAAAAB4/GDCbylfkObU/s72-c/2011-10-17_145409.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-6978803604019614675</id><published>2011-06-02T21:13:00.017+03:00</published><updated>2011-06-06T00:11:20.732+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='staging'/><category scheme='http://www.blogger.com/atom/ns#' term='Yoav Landman'/><category scheme='http://www.blogger.com/atom/ns#' term='promotion'/><category scheme='http://www.blogger.com/atom/ns#' term='release management'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Jenkins New Maven and Gradle Release Management and Why You Should Look Into It?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;i&gt;Jenkins now offers a new robust solution for release staging and promotion in the form of the Jenkins Artifactory Plugin. This solution is fast, lightweight and works for for BOTH Maven and Gradle builds&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;The Need for a Better Release Alternative&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are using Jenkins (or Hudson, before) then releasing and promoting build artifacts isn’t necessarily a flawless experience or may not be completely solved. To go over the main reasons of why this is so, I would like to look at Maven and Gradle builds separately.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;b&gt;Maven and the M2 Release Plugin&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;First, Maven. Jenkins already has a solution for releasing Maven artifacts in the form of the &lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/M2+Release+Plugin" style="font-family: inherit;"&gt;m2 release&amp;nbsp;plugin&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;. The plugin is essentially a wrapper on the client-side &lt;/span&gt;&lt;a href="http://maven.apache.org/plugins/maven-release-plugin/" style="font-family: inherit;"&gt;Maven release plugin&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;. When it executes it runs an out-of-process Maven build with release tasks. This is natural for a plugin that was designed to run by a user on his machine, but running it server-side has a couple of serious issues:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: inherit;"&gt;&lt;li&gt;The m2 release plugin invokes its own Maven instance that may be of a different version than the one defined for the job. Jenkins, not controlling this build, will not record any information about the release artifacts and will not archive them&lt;/li&gt;&lt;li&gt;The plugin also uses different SCM settings and credentials than the ones defined inside Jenkins. This double-configuration is error prone, and makes reproducibility difficult&lt;/li&gt;&lt;li&gt;Rollbacks are hard. With no built-in automatic rollback, when failure happens in the release flow, rollbacks become a manual task. Without a CLI, and given that the run is not interactive, this becomes even harder. Moreover, SCM tags are created with credentials that users may not have access to&lt;/li&gt;&lt;li&gt;It is unnecessarily SLOW. In fact, a release flow involves 3(!) full clean/compile/test cycles (you can read more about this in this &lt;a href="http://www.axelfontaine.com/2011/01/maven-releases-on-steroids-adios.html"&gt;blog post&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b style="font-family: inherit;"&gt;Gradle&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; If you are using Gradle, you are already driving your builds with elegant Groovy model+script. You may want to take advantage of that and enrich your builds with custom release logic via a Gradle plugin, which may be enough for your needs. However, there are some drawbacks to this approach:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="font-family: inherit;"&gt;You will need to duplicate the plugin configuration in each new project and introduce release configuration in your build logic. If you run the release from a developer machine, this is fine. However, for the most part this is not the case and releasing from the CI server with greater control and traceability calls for the configuration to be part of the job&lt;/li&gt;&lt;li&gt;With no strong concept of release “action” that Jenkins can understand, there can be no indicators in Jenkins or in the artifacts repository (Artifactory in this case), that a build was in fact released and that artifacts are part of a release&lt;/li&gt;&lt;li&gt;As with Maven, rollbacks may require manual intervention and running a release build on the server will not reuse Jenkins job’s setting like SCM details, resulting in dual configuration&lt;/li&gt;&lt;/ul&gt;&lt;b style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;b style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;b style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Meet the Jenkins Artifactory Plugin&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Given all that, we at JFrog, decided to pick up the glove and develop a new release and promotion alternative. The &lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Artifactory+Plugin" style="font-family: inherit;"&gt;Jenkins&amp;nbsp;Artifactory plugin &lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;provides a release management plugin that  is:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lightweight and fast - only 1 compile/test cycle is required&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Has close integration with your Jenkins exiting configuration, so it reuses the SCM and build settings. The plugin directly integrates with the execution of the&amp;nbsp;&lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Maven+2+Project+Plugin" style="font-family: inherit;"&gt;Jenkins Maven plugin&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;and the&amp;nbsp;&lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Gradle+Plugin" style="font-family: inherit;"&gt;Jenkins Gradle plugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Offers very robust and reliable rollback - the plugin is primarily focused on working correctly with GIT and Subversion, respecting the differences between the tools and how tagging and branching is handled in VCS compared to a DVCS, so we don’t have to compromise on a common denominator&lt;/li&gt;&lt;li&gt;Provides finer control over which properties (in Gradle) or POM versions (for Maven) should change upon release and which ones should also change for the next development cycle&lt;/li&gt;&lt;li&gt;All commit comments are adjustable and can use Jenkins parameters&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;When used in conjunction with Artifactory for managing your build artifacts the plugin also -&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Offers advanced control over staging &amp;amp; promotion flow - build artifacts can be staged to a certain repository, and staged artifacts can be either released or rolled-back directly from Jenkins UI with  changing of the release status in Artifactory without requiring a rebuild&lt;/li&gt;&lt;li&gt;Audits all release and promotion actions&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Makes release builds fully traceable by deploying a &lt;/span&gt;&lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Build+Integration" style="font-family: inherit;"&gt;build-info&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; json object along with the binary artifacts, with information about: environment vars; all artifacts produced; all effective dependencies used; and even all licenses used by those dependencies&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Allows users to attach custom searchable properties to release artifacts upon deployment&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Judging by user feedback, the Jenkins Artifactory Plugin really manages to make a difference by providing Maven users with a better alternative and Gradle users with an integrated Jenkins-side solution, for easy staging and promotion experience which is fast and reliable.&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Give it a try now and see for yourself :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The Jenkins Artifactory plugin can be found on the &lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Artifactory+Plugin" style="font-family: inherit;"&gt;Jenkins&amp;nbsp;Plugin Center&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;, with the release management specific page &lt;/span&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Artifactory+Plugin+-+Release+Management" style="font-family: inherit;"&gt;here&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;. All sources are on &lt;/span&gt;&lt;a href="https://github.com/jenkinsci/artifactory-plugin" style="font-family: inherit;"&gt;Github&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; under the Apache 2 license.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Expect similar release management support from JFrog in the next versions of the &lt;/span&gt;&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fwiki.jfrog.org%2Fconfluence%2Fdisplay%2FRTF%2FTeamCity%2BArtifactory%2BPlug-in&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFlCh9u9Cn2aPnCXON1TZFKz7NvNg" style="font-family: inherit;"&gt;TeamCity Artifactory plugin&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; and the &lt;/span&gt;&lt;a href="http://www.google.com/url?q=https%3A%2F%2Fplugins.atlassian.com%2Fplugin%2Fdetails%2F27818&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHLHhYMgYnDmBP5gHf-Lb4BDvHsAA" style="font-family: inherit;"&gt;Bamboo Artifactory plugin&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-6978803604019614675?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/6978803604019614675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/06/jenkins-new-maven-and-gradle-release.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/6978803604019614675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/6978803604019614675'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/06/jenkins-new-maven-and-gradle-release.html' title='Jenkins New Maven and Gradle Release Management and Why You Should Look Into It?'/><author><name>Yoav Landman</name><uri>http://www.blogger.com/profile/04609544830985043196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_a5tMhAMGeN0/S458ju-vC9I/AAAAAAAAAGc/tctBm9XFIjI/S220/yoav.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-2160826725136993798</id><published>2011-05-29T15:16:00.003+03:00</published><updated>2011-05-29T15:36:02.551+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>The Future of CI at JAX Conf</title><content type='html'>The Future of CI at JAX Conf - San Jose June, 2011&lt;br /&gt;&amp;nbsp;by Fred Simon&lt;br/&gt;&lt;br /&gt;These are exciting days for Continuous Integration users and for us - JFrog Artifactory team.&lt;br/&gt;&lt;br /&gt;Following the successful &lt;a href="http://blogs.jfrog.org/2011/04/first-continuous-integration-summit.html"&gt;CI Summit held in LinkedIn HQ&lt;/a&gt; last month, we are now heading to the &lt;a href="http://www.jaxconf.com/"&gt;San Jose JAX Conf&lt;/a&gt;!&lt;br /&gt;This year, for the first time, the great European JAX conference is going to the Bay Area as JAXConf.&lt;br /&gt;It will be an amazing gathering for our (JFrog) ecosystem.Many players that keep pushing the limit of Continuous Development, Build, Integration and Deployment, with their tools, knowledge and case study will be there:&lt;ul&gt;&lt;li&gt;Kohsuke Kawaguchi from &lt;a href="http://cloudbees.com/"&gt;Cloudbees&lt;/a&gt; and Ken Sipe from &lt;a ref="http://gradleware.com/"&gt;Gradleware&lt;/a&gt;, are getting ready for &amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=19227"&gt;Jenkins &amp;amp; Gradle Hackathon&lt;/a&gt;&amp;rdquo;. It&amp;rsquo;s promising a lot of great features for Gradle and Jenkins users. We will see how our great latest &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Gradle+Artifactory+Plugin"&gt;Gradle-Jenkins-Artifactory plugin&lt;/a&gt;&amp;nbsp;and clean DSL will improve your day!&lt;/li&gt;&lt;li&gt;Of course Kohsuke Kawaguchi will present &amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=17935"&gt;Continuous Integration with Jenkins&lt;/a&gt;&amp;rdquo;, and it&amp;rsquo;s always a pleasure to hear and see Kohsuke express his view of CI and how &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;&amp;nbsp;is moving the field forward.&lt;/li&gt;&lt;li&gt;And Ken Sipe will be &amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=18328"&gt;Rocking the Gradle&lt;/a&gt;&amp;rdquo; and show this amazing new build tool: &lt;a href="http://gradle.org"&gt;Gradle&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The current growth of CI and DevOps is really impressive! The demand is so big that a full afternoon will be dedicated to CI, &amp;ldquo;&lt;a href="http://jaxconf.com/2011/community/"&gt;The CI Circus&lt;/a&gt;&amp;rdquo; as a free community event.&lt;br /&gt;And there Carl Quinn from Netflix, will present the amazing platform they setup &amp;ldquo;Netflix in the Cloud&amp;rdquo;, using Jenkins and Artifactory!&lt;br/&gt;&lt;br /&gt;A lot of amazing talks about Continuous Integration, DevOps tools, and automated ALM will be presented:&lt;ul&gt;&lt;li&gt;&amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=17626"&gt;Git Going with a Distributed Version Control System!&lt;/a&gt;&amp;rdquo; by Matthew McCullough, Tim Berglund: The push for a VCS that can answer the need for very short cycles is very strong. Today, Git is really unlocking most of VCS bottlenecks. But it&amp;rsquo;s well known: &amp;ldquo;I know git can do it! I just don&amp;rsquo;t know how to tell it what I want!&amp;rdquo;. This full day tutorial should help with that issue.&lt;/li&gt;&lt;li&gt;&amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=17936"&gt;Improving the technical quality of your Java project&lt;/a&gt;&amp;rdquo; by Alexander von Zitzewitz from &lt;a href="http://www.hello2morrow.com/"&gt;Hello2morrow&lt;/a&gt;, will present how to keep project quality over time.&lt;/li&gt;&lt;li&gt;&amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=19231"&gt;Managing Software from Development to Deployment in the Cloud&lt;/a&gt;&amp;rdquo; by Harpreet Singh, Vivek Pandey from &lt;a href="http://www.cloudbees.com/"&gt;Cloudbees&lt;/a&gt;: They will present the next generation platform to &amp;ldquo;build and deploy your apps in the cloud&amp;rdquo;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And of course, I&amp;rsquo;m looking forward to present &amp;ldquo;&lt;a href="http://it-republik.de/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=jax_us_2011_&amp;amp;id=18263"&gt;You Killed My Build! Prepare To Die!&lt;/a&gt;&amp;rdquo;, were I will demo a state-of-the-art integration between Jenkins, Gradle and Artifactory. The setup support build isolation, release staging and promotion, and simplified developers on-boarding.&lt;br/&gt;&lt;br /&gt;Hope to see you all there!&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-2160826725136993798?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/2160826725136993798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/05/future-of-ci-at-jax-conf.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2160826725136993798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2160826725136993798'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/05/future-of-ci-at-jax-conf.html' title='The Future of CI at JAX Conf'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-5665786193740869871</id><published>2011-05-23T14:28:00.002+03:00</published><updated>2011-05-23T14:32:51.876+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><title type='text'>Thinking in Gradle!</title><content type='html'>Since my first encounter with &lt;a href="http://gradle.org"&gt;Gradle&lt;/a&gt; and Hans Dockter (TSSJS 2009 in Las Vegas), I slowly (but surely) started to use this new build tool in many environment and projects.&lt;br /&gt;Today, I’m hooked and I don’t think there is a better way to build!&lt;br /&gt;But, the main issue I encountered is how to convince other that Gradle is the good way to go? It took me time to get the hang of it, it took even more time to understand what Hans meant when he says: &lt;b&gt;“What’s important is the model!”&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Here is how I describe my &lt;b&gt;“Thinking in Gradle!”&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After many years of Ant, and Maven brain washing, the main paradigm shift that I needed to understand the power of Gradle is: Gradle let you write code that create a dynamic model of your build.&lt;br /&gt;I needed to stop thinking in terms of declaring properties (Ant), or POM static model, but an aggregation of executable blocks (Groovy closures), that will create the exact model of what are my projects, task, dependencies and products.&lt;br /&gt;I don’t need to “extends”, I don’t need to “exclude”, I don’t need to “override”.&lt;br /&gt;When playing with static declaration of your build model, the way to avoid repeating yourself is by declaring what’s good for 80% of your modules in a super POM, and then adding skip or repeating detailed plugin configuration for the other 20%.&lt;br /&gt;In any case, you are repeating yourself a lot, and you always try to change your code or module layout to fit the less resistance of your build tool.&lt;br /&gt;&lt;br /&gt;Your &lt;b&gt;“static”&lt;/b&gt; build model is freezing your ability to re-organize your modules as they should be.&lt;br /&gt;&lt;br /&gt;With Gradle, the build model is created from executable Groovy code. So, nothing, I really mean &lt;b&gt;nothing is static&lt;/b&gt;.&lt;br /&gt;It’s extremely disturbing for newcomers. I want my properties, my XML, my declarations :)&lt;br /&gt;No! It’s only code, dynamic Groovy code!&lt;br /&gt;The model will emerge from Groovy collection closures (apply this to any model element that matches), some “if”s when needed, and a lot of beautiful GStrings for expressing dynamic values. You cannot keep your thinking of static XML, when you write your Gradle build!&lt;br /&gt;&lt;br /&gt;OK, you may think that the dynamic part is just your mental representation of a POM hierarchy and dependencies.&lt;br /&gt;Well, in Gradle the execution task graph (every little plugin execution of your Maven lifecycle, which is extremely static and a nightmare to modify) is also dynamic.&lt;br /&gt;It means that the way you chain the tasks that will be executed are also defined in code, not in XML :)&lt;br /&gt;&lt;br /&gt;And of course, the part that everyone expects: The execution block of a task is also in Groovy (or Java) code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;Until I let go of my old concepts of static task dependencies (Ant), and static project model (Maven), I missed most of the beauty and power of Gradle!&lt;br /&gt;Hope this will help others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-5665786193740869871?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/5665786193740869871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/05/thinking-in-gradle.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5665786193740869871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5665786193740869871'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/05/thinking-in-gradle.html' title='Thinking in Gradle!'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-4726650752934603349</id><published>2011-04-20T10:41:00.000+03:00</published><updated>2011-04-20T10:41:30.720+03:00</updated><title type='text'>The First Continuous Integration Summit - Video Available!</title><content type='html'>&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;br /&gt;On April 7&lt;sup&gt;th&lt;/sup&gt;, we held the &lt;a href="http://www.jfrog.org/ci-summit" target="_blank"&gt;First Continuous Integration Summit&lt;/a&gt; at LinkedIn HQ in the Silicon Valley.&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;We were overbooked a week from opening the event registration page! This enthusiastic response, in addition to the feedback we received (and still getting) from the community, illustrates the great appetite for gaining and learning more about CI technologies and methodologies.&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;Together with our partners from &lt;a href="http://gradleware.com/" target="_blank"&gt;Gradleware&lt;/a&gt; and &lt;a href="http://www.cloudbees.com/" target="_blank"&gt;CloudBees&lt;/a&gt;, we have managed to stir up and arrange this event for all of you who use and explore Continuous Integration tools and technologies.&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;We couldn’t be more excited to be part of the very first Continuous Integration Summit, an opportunity made possible largely thanks to LinkedIn, who hosted the event and now provides us with this video recording of the sessions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: 7pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;LinkedIn Case Study&lt;/b&gt; – present and future of LinkedIn's codebase build&lt;/li&gt;&lt;li&gt;&lt;b&gt;"Who Moved My Module?!"&lt;/b&gt; – Yoav Landman, JFrog CTO and Artifactory Creator&lt;/li&gt;&lt;li&gt;&lt;b&gt;"Enter the Gradle"&lt;/b&gt; – Hans Dockter, Gradleware CEO and founder&lt;/li&gt;&lt;li&gt;&lt;b&gt;"Status of the Jenkins Project"&lt;/b&gt; – Kohsuke Kawaguchi, CloudBees architect and Jenkins Project lead&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-bottom: .0001pt; margin-bottom: 0cm; margin-left: 36.0pt; margin-right: 0cm; margin-top: 5.0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/Lk2l6Mw-HLk/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Lk2l6Mw-HLk&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/Lk2l6Mw-HLk&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;&lt;b&gt;We already started planning the next CI Summit – stay tuned ….&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;Enjoy ;)&lt;/div&gt;&lt;div class="MsoNormal" style="mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"&gt;JFrog Team&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-4726650752934603349?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/4726650752934603349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/04/first-continuous-integration-summit.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/4726650752934603349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/4726650752934603349'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/04/first-continuous-integration-summit.html' title='The First Continuous Integration Summit - Video Available!'/><author><name>Shlomi</name><uri>http://www.blogger.com/profile/07760000963164931009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-5876219737568612772</id><published>2011-02-24T22:38:00.000+02:00</published><updated>2011-02-24T22:38:12.908+02:00</updated><title type='text'>Artifactory Vs. Nexus The Integration Matrix</title><content type='html'>&lt;div style="margin: 0px;"&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-family: Arial;"&gt; &lt;i&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Are you stuck with your vendor stack ?!&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;The evolution of Continuous Integration, build tools and build servers in the past years has been very impressive. The amount of projects (open source, or not) and tools that were launched and &lt;/span&gt;later adopted by the community (Maven, Gradle, Jenkins/Hudson, TeamCity, Bamboo, and more...) shows that this is the future of software development and this is how people will build and package their applications.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Arial;"&gt;One of the greatest advantages, especially in the Java world, is that development teams have the freedom to choose and build modular environments by integrating the tools that they like, need and that were adopted by their organization.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;br /&gt;This is why our users build their projects using Maven, TeamCity, Ivy, Hudson, Gradle, Bamboo and recently Jenkins ;). Bottom line is, you should not be concerned about the ability of the tools&amp;nbsp; to integrate while designing your CI stack!&lt;br /&gt;&lt;br /&gt;BUT, things are changing. Now even more with the fork of Hudson CI (currently owned by Oracle), Artifactory has come to be the only Binary Repository Manager that gives you the real freedom to choose!&lt;br /&gt;&lt;br /&gt;We are not presenting ourselves as a community “&lt;a href="http://weblogs.java.net/blog/fabriziogiudici/archive/2010/03/23/oracle-officially-asked-sonatype-back-javanet"&gt;rescuer&lt;/a&gt;” under the open source hood, or try to take ownership over successful projects that were&amp;nbsp;&lt;a href="http://www.itworld.com/open-source/137722/oracle-responds-hudsonjenkins-split"&gt;developed by the community&lt;/a&gt;&amp;nbsp;(such as Maven or Hudson); we are developing Artifactory in a way that gives our users the ability to work with their tools and technologies of choice within the build ecosystem.&lt;br /&gt;&lt;br /&gt;During the past year, JFrog’s team has been developing for the Artifactory users a number of open source plug-ins that are tightly integrated with the worlds leading tools and vendors.&lt;br /&gt;&lt;br /&gt;The following comparison tables are more than just a list of features - it is what we envision when we think about the software development tooling, and how we ensure that our users keep their freedom of choice:&lt;br /&gt;&lt;br /&gt;&lt;b style="color: black;"&gt;Build tools integration&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin: 0px; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DStfBoufkQc/TWayeXDAJUI/AAAAAAAAAAo/oqzFa-I7Hik/s1600/matrix1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DStfBoufkQc/TWayeXDAJUI/AAAAAAAAAAo/oqzFa-I7Hik/s1600/matrix1.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin: 0px; text-align: center;"&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;div style="margin: 0px;"&gt;&lt;b&gt;Build servers integration&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;div style="margin: 0px;"&gt;&lt;a href="http://4.bp.blogspot.com/-85i7ZpO01bs/TWaxBHICwLI/AAAAAAAAAAk/abhVW_jKLNI/s1600/matrix2.png" imageanchor="1" style="clear: left; display: inline ! important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-85i7ZpO01bs/TWaxBHICwLI/AAAAAAAAAAk/abhVW_jKLNI/s1600/matrix2.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin: 0px;"&gt;&lt;span style="font-size: x-small;"&gt;Some features are part of the pro versions of Artifactory and Nexus.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;Now, it’s easy to say “We will provide you with one full stack”, but isn’t that like saying “We know better what’s good for you”? Is it preferable over giving you the freedom to choose?!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-5876219737568612772?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/5876219737568612772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2011/02/artifactory-vs-nexus-integration-matrix.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5876219737568612772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5876219737568612772'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2011/02/artifactory-vs-nexus-integration-matrix.html' title='Artifactory Vs. Nexus The Integration Matrix'/><author><name>Shlomi</name><uri>http://www.blogger.com/profile/07760000963164931009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-DStfBoufkQc/TWayeXDAJUI/AAAAAAAAAAo/oqzFa-I7Hik/s72-c/matrix1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-7501037192353545939</id><published>2010-07-26T10:06:00.008+03:00</published><updated>2010-08-06T23:51:32.595+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFrog'/><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>To Build or Not to Be - Seminar Videos</title><content type='html'>JFrog's Continuous Integration and Build Seminar &lt;a href="http://www.jfrog.org/mail/build-seminar-invitation.html"&gt;"&lt;span style="font-weight:bold;"&gt;To Build or Not to Be&lt;/span&gt;"&lt;/a&gt;, took place on July 1st, 2010 and was a big success.&lt;br /&gt;&lt;br /&gt;The sessions of Kohsuke Kawaguchi  creator of &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; and CEO of &lt;a href="http://infradna.com/"&gt;InfraDNA&lt;/a&gt;, and Hans Dockter creator of &lt;a href="http://gradle.org/"&gt;Gradle&lt;/a&gt; and CEO of &lt;a href="http://www.gradle.biz/"&gt;Gradle Inc&lt;/a&gt; are now available online.&lt;br /&gt;&lt;br /&gt;Watch now the videos of &lt;a href="http://vimeo.com/13546071"&gt;"&lt;span style="font-weight:bold;"&gt;Gradle - A Better Way To Build&lt;/span&gt;"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13546071&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13546071&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;and &lt;a href="http://vimeo.com/13581660"&gt;"&lt;span style="font-weight:bold;"&gt;Doing More with Hudson&lt;/span&gt;"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=13581660&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=13581660&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-7501037192353545939?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/7501037192353545939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2010/07/to-build-or-not-to-be-seminar-videos.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/7501037192353545939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/7501037192353545939'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2010/07/to-build-or-not-to-be-seminar-videos.html' title='To Build or Not to Be - Seminar Videos'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-2077976827316892234</id><published>2010-05-11T15:54:00.003+03:00</published><updated>2010-05-11T16:08:29.256+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>The case study of JBoss Repository Manager</title><content type='html'>Most of the issues encountered by JBoss developers with their new build infrastructure are discussed openly &lt;a href="http://community.jboss.org/community/build" id="lkue" title="here"&gt;here&lt;/a&gt;. This is an important source of information about the problems encountered with a Hudson, Maven and Sonatype-Nexus integration.&lt;br&gt;&lt;br /&gt;&lt;div&gt;Since we (&lt;a href="http://www.jfrog.org/" id="ablf" title="JFrog"&gt;JFrog&lt;/a&gt;) worked on Hudson, Maven, and Repository Manager environment for many years, we provided some feedbacks to JBoss.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The main thing is: We are not promoting or supporting any particular build technology and so when Maven does not fit we are not afraid to say it as it is.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This case study exposes vividly the differences between Nexus and Artifactory!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here are the issues I'm talking about:&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Mod dav or http(s) deployment URL&lt;/li&gt;&lt;li&gt;Managing the distributionManagement XML tag in pom.xml&lt;/li&gt;&lt;li&gt;Using password for Maven deployment&lt;/li&gt;&lt;li&gt;Timeout and performance issues&lt;/li&gt;&lt;li&gt;Maven metadata XML issue&lt;/li&gt;&lt;li&gt;Maven deploy failures&lt;/li&gt;&lt;li&gt;Creating and verifying checksums&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;1) Mod dav or http(s) deployment URL&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;To solve the timeout on deploy issue for &lt;a href="http://community.jboss.org/message/541222#541222" id="pyhx" title="richfaces"&gt;richfaces&lt;/a&gt;, the recommendation was to use pure https instead of dav:https as url deployment.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here are all the caveeat you need to know about Maven deploy wagons:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are 3 main kind of Wagon used with Maven: Lightweight http (the default today), Heavyweight http (the default for older Maven versions), Dav.&lt;/li&gt;&lt;li&gt;Dav uses transactions when deploying, it has a better management of memory on the client side, and has a &lt;a href="http://jira.codehaus.org/browse/MNG-4301" id="p93t" title="bug calculating checksums"&gt;bug calculating checksums&lt;/a&gt;. Dav is a must when deploying big files. Now, the issue with dav is you can get timeout due to transactions, so the recommendation is correct!&lt;/li&gt;&lt;li&gt;Lightweight http(s) included in Maven, cache the whole byte array in memory so cannot work for big deployment.&lt;/li&gt;&lt;li&gt;Dav and Heavyweight protocols suffer from a default configuration that transfer each deployed file twice over the net. This is due to standard HTTP protocol always trying to send a request without authentication, then with it. Check &lt;a href="http://issues.jfrog.org/jira/browse/RTFACT-3039" id="xs-o" title="this"&gt;this&lt;/a&gt; to find the way to configure preeemptive http authentication in Maven simple http client.&lt;/li&gt;&lt;li&gt;Maven is caching credentials information based on URL. It means that if you are authenticating the read queries, the same read credentials are used for deploy! See "Configuring Authentication" &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Configuring+Artifacts+Resolution" id="ggmf" title="here"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Basically, looking at the above options nothing is satisfactory with standard Maven.&lt;br /&gt;&lt;div&gt;To solve this issue, we (JFrog) created a &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Build+Integration" id="l0ma" title="build client plugin"&gt;build client plugin&lt;/a&gt;&amp;nbsp;that manages deployment of the artifacts using Apache commons http client with preemptive authentication and optimized response time. For info: This client is used to deployed full DVD images of 4.5Gb to Artifactory multiple times per day, from multiple Hudson servers and agents...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;2) Managing the distributionManagement XML tag in pom.xml&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;To manage correctly all the above parameters, and the deployed URL of the exact repository location for each projects, you need to configure the distributionManagement tag in the pom.xml. This generates a lot of friction, and makes rebuilds of SVN tags almost impossible.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;For good reason, JBoss wants to split the repository manager into multiple servers and local repositories, so each projects will deploy their artifacts to a dedicated repository.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Since this distribution is a progressive change, all the previous builds and SVN tags are obsolete and cannot be reproduced...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;We believe that managing deployment configuration parameters should be done outside Maven, and that's why we have an &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Hudson+Artifactory+Plug-in" id="y9p6" title="Artifactory-Hudson plugin"&gt;Artifactory-Hudson plugin&lt;/a&gt; that does exactly this. Your pom.xml are clean of repository manager URLs and you can tuned deployment parameters (Timeout, http or https, ...) in Hudson outside Maven.&lt;br&gt;&lt;br /&gt;BTW: The Artifactory-Hudson plugin provides a lot more features like full bidirectional traceability between Artifactory and Hudson for all the artifacts produced and used during each hudson job execution.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;3) Using password for Maven deployment&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Like described&amp;nbsp;&lt;a href="http://community.jboss.org/wiki/Mavensettingsxmlmaskingpassword" id="c0yi" title="here"&gt;here&lt;/a&gt; having encrypted password in your settings.xml is a little annoying but it works. Now, you need to know that it still forces you to use https since the clear text password will pass on the net. Now, the issue with Repository Manager password is that all kind of automation scripts beside maven needs them (Hudson, &lt;a href="http://community.jboss.org/wiki/MavenSnapshotRepository#comment-1947" id="i8ca" title="buildr"&gt;buildr&lt;/a&gt;, Ant, auto-backup, rsync, ...), and so you always find yourself in a tricky situation, see &lt;a href="http://jira.codehaus.org/browse/MNG-4626" id="m4tv" title="this"&gt;this&lt;/a&gt; and &lt;a href="http://jira.codehaus.org/browse/MNG-4612" id="og4y" title="that"&gt;that&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;To solve this issue, we implemented an &lt;a href="http://blogs.jfrog.org/2009/01/avoiding-clear-text-passwords-in-maven.html" id="wlp2" title="encrypted password system"&gt;encrypted password system&lt;/a&gt; that works as follow:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Artifactory generates an asymmetric key pair for each user,&lt;/li&gt;&lt;li&gt;Entering your clear text password in the UI gives you a block of the settings.xml with your personal encrypted password,&lt;/li&gt;&lt;li&gt;The above encrypted password can be used anywhere (not only maven), and allows only REST API access (maven deploy and so on) not UI access,&lt;/li&gt;&lt;li&gt;With the encrypted password, https to do maven deploy is not a must anymore =&amp;gt; a lot less load on the servers,&lt;/li&gt;&lt;li&gt;Stealing the encrypted password or the private key (kept in Artifactory DB) has minimal security impact compare to full clear text decryption of all the passwords used on the JBoss Hudson server,&lt;/li&gt;&lt;li&gt;You can enforce to always use encrypted password for REST and maven deploy.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;4) Timeout and performance issues&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;This issue is related to the dav mode, the JVM memory parameters, OS open file handles tuning, but also to the next issue about maven-metadata.xml files.&lt;br&gt;&lt;br /&gt;From our experience, one issue with latest 1.6 Sun JVM is the miscalculation of young memory size. So, when updating/upgrading your server you should verify that -XX:NewSize and -XX:MaxNewSize are at least set to 2/3 of the total heap size. Artifactory (like Nexus) needs a lot of memory space per request (managing files), and so the young eden space of the JVM is the most important parameter. Just be careful to set a good multiple of mega bytes has the JVM has a bug moving memory blocks from young to old gen space.&lt;br /&gt;&lt;div&gt;From what I read &lt;a href="http://community.jboss.org/en/build/blog/2010/05/07/maven-repository-performance-update" id="hw1x" title="here"&gt;here&lt;/a&gt;, this is what I recommend: "&lt;font face="'courier new'"&gt;-server -Xms1g -Xmx1g -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewSize=512m -XX:MaxNewSize=512m"&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;5) Maven metadata XML issue&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;This issue is a little tricky to explain, I hope I'll be clear :)&lt;br /&gt;&lt;div&gt;For each maven pom or jar file of a SNAPSHOT version, maven needs to 2 maven-metadata.xml files. I'll take the richfaces issue as an example:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Deploying: &lt;font face="'Courier New'"&gt;org/richfaces/ui/modal-panel/3.3.4-SNAPSHOT/modal-panel-3.3.4-SNAPSHOT.pom&lt;/font&gt; needs to update:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;font face="'courier new'"&gt;org/richfaces/ui/modal-panel/3.3.4-SNAPSHOT/maven-metadata.xml&lt;/font&gt;&amp;nbsp;to update the timestamp and or the latest unique version number of this version,&lt;/li&gt;&lt;li&gt;&lt;font face="'courier new'"&gt;org/richfaces/ui/modal-panel/maven-metadata.xml&lt;/font&gt;&amp;nbsp;to update the list of available SNAPSHOT versions and the latest one created.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The issue is that the maven client is doing this complicated work, combined with the fact that maven-metadata.xml files are very repeatedly requested by maven to build its version resolution scheme.&lt;br /&gt;&lt;div&gt;So, in this example, for every module of richfaces 3.3.X-SNAPSHOT, maven deploy the jar (twice due to issue 1), the pom, the sources, read the previous values of maven-metadata.xml on both folders, then write them down (twice due to issue 1). Of course due to dav and the heavy read on these files, you get timeouts.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The performance tuning planned&amp;nbsp;&lt;a href="http://community.jboss.org/wiki/MavenRepositoryPerformance" id="b-cx" title="here"&gt;here&lt;/a&gt; will help solve this issue since the reads will be offloaded to nginx.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Be aware, you will hit a bigger problem due to the above design: Repeated corruption of maven-metadata.xml files!&lt;/div&gt;&lt;br /&gt;Like everyone, most of JBoss projects have upstream and downstream dependencies in Hudson. For example: richfaces-jsf2 depends on &lt;a href="https://hudson.jboss.org/hudson/view/Richfaces/job/RichFaces-3.3/" id="z9md" title="richfaces"&gt;richfaces&lt;/a&gt;. So, it is common that multiple separate SNAPSHOT hudson job (let say richfaces-3.3.4-SNAPSHOT and richfaces-3.3.5-SNAPSHOT) will get executed in parallel. As you can see from the above maven design, the calculation of maven-metadata.xml files will almost certainly fail.&lt;br&gt;&lt;br /&gt;To solve this issue, our deployment system (in the hudson plugin) knows that Artifactory is a smart repository manager and so sends only the pom, jars and verified checksum to the repository manager. Artifactory is then queuing maven metadata recalculation tasks asynchronously, and so avoiding parallelism conflicts and timeout. Implementing this mechanism was &lt;a href="http://issues.jfrog.org/jira/browse/RTFACT-3040" id="h7cu" title="far from evident"&gt;far from evident&lt;/a&gt;, but we have today integration tests deploying 5 different snapshot versions concurrently (and repeatedly) without a hitch :)&amp;nbsp;&lt;br&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;6) Maven deploy failures&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;As seen &lt;a href="https://hudson.jboss.org/hudson/view/Richfaces/job/RichFaces-3.3/566/" id="venn" title="here"&gt;here&lt;/a&gt;, on failed Hudson jobs trying to deploy to Nexus, you end up with half deployed projects. It means that until the successful build 572 of richfaces, the repository contained a random list of good and bad jars and pom for the same project/version. It is recommended to actually do the deployment only until the full build is successful.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Deployment needs to be a post build action of Hudson (like it is done in our plugin).&lt;br&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;7) Creating and verifying checksums&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;div&gt;Since maven is calculating and deploying the checksum to JBoss Nexus instance, you have general issues like:&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Playing with dav may have generated a lot of bad checksums that you don't know of;&lt;/li&gt;&lt;li&gt;There is no bad checksum verification on deploy, and so the build will be successful but users will get a wrong checksum error;&lt;/li&gt;&lt;li&gt;Since the correspondance between hudson and maven checksums could not be trusted you'll lost traceability between Hudson and Nexus.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For info: Artifactory is capable of failing the deployment if checksums does not match, and has many &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Local+Repositories" id="vvf1" title="checksums policy configuration"&gt;checksums policy configuration&lt;/a&gt;.&lt;br&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I hope Red Hat will solve their build infrastructure issues for the good of JBoss developers and users :)&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-2077976827316892234?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/2077976827316892234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2010/05/case-study-of-jboss-repository-manager.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2077976827316892234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2077976827316892234'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2010/05/case-study-of-jboss-repository-manager.html' title='The case study of JBoss Repository Manager'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-212739737899831410</id><published>2010-03-03T17:17:00.046+02:00</published><updated>2010-03-07T17:33:33.970+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFrog'/><category scheme='http://www.blogger.com/atom/ns#' term='Noam Tenne'/><category scheme='http://www.blogger.com/atom/ns#' term='Diego Pacheco'/><category scheme='http://www.blogger.com/atom/ns#' term='ivy'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Building an Enterprise Repository with Artifactory</title><content type='html'>&lt;style type="text/css"&gt;.ln { color: rgb(0,0,0); font-weight: normal; font-style: normal; } .s0 { } .s1 { color: rgb(0,0,128); font-weight: bold; } .s2 { } .s3 { color: rgb(0,0,255); font-weight: bold; } .s4 { color: rgb(0,128,0); font-weight: bold; } .s5 { font-weight: bold; }&lt;/style&gt;&lt;br /&gt;&lt;b&gt;*The content of this blog is a translation of a &lt;/b&gt;&lt;a href="http://diego-pacheco.blogspot.com/2010/02/construindo-um-repositorio-corporativo.html"&gt;&lt;b&gt;blog posted&lt;/b&gt;&lt;/a&gt;&lt;b&gt; in Portuguese by Diego Pacheco.*&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I clearly recall experiencing &lt;a href="http://en.wikipedia.org/wiki/DLL_hell" target="_blank"&gt;DLL hell&lt;/a&gt; while working predominantly with Microsoft products. We suffered from dependency issues back then and we still suffer from them today.&lt;br /&gt;&lt;br /&gt;When I started working with Java I suffered from a similar development concern. The specifics are a little different, but the essence of the problem is the same – dependencies. Java developers know this experience as &lt;a href="http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell" target="_blank"&gt;JAR hell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's amazing to me that companies still struggle with these issues in 2010. There are good solutions for solving dependency problems. Two such solutions are Apache Maven 2 and Apache Ivy. Both these Apache solutions provide dependency management.&lt;br /&gt;&lt;br /&gt;It's common to see a folder called *lib* in the classpath of Java applications containing more than 100 jars. Often, 70% or more of these jars are completely useless, never used, never have been touched by the system ClassLoader, or will seldom ever be accessed by any system or user-defined ClassLoader. Still, they remain in the build. But why? Why leave so many many jars to bloat the application? For two reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Dependency Problems:&lt;/b&gt; Everyone has probably seen the famous &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassNotFoundException.html" target="_blank"&gt;ClassNotFoundException&lt;/a&gt; at one time or another. Often, this problem is solved by copying all the jars from the application server and framework distributions we use to the good old *lib* folder. Of course, this is not an elegant solution, and it is not a good solution, but is widely used because it is easy to implement and it saves time. The problem you get to live with is that you're hoarding a bunch of jars you don't need and the size of your application will swell.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; The more robust application servers like Websphere for instance, let you create shared libraries. You don't have to pack all the jars with your distribution (i.e. ear, war, jar) because you can let the server put them in the classpath.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ignorance:&lt;/b&gt; Many companies still don't use any dependency management solutions. As a consultant I've seen this a lot, in Brazil and abroad. Maybe some companies believe their developers are doing great without some fancy management solution. The rest of us will be investing in dependency management solutions. Personally, I like either Maven or Ivy for dependency resolution.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;i&gt;Using a Dependency Manager&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;If you still don't make use of a framework for dependency resolution, I recommend you to start using one ASAP.&lt;br /&gt;Either Apache Maven 2 or Apache Ivy will provide you with benefits like:&lt;/div&gt;&lt;/div&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;b&gt;Transitive dependencies:&lt;/b&gt; making it easier to find those elusive dependencies&lt;/li&gt;&lt;li&gt;&lt;b&gt;Versioning:&lt;/b&gt; Using the "dump it in the *lib* folder" approach there is no control over which version is needed or which version is in production or development. A dependency management framework provides you with fine granularity control without going mad.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Automatic downloading:&lt;/b&gt; With a dependency management solution, you don't have to search for dependencies, download them, and put them into the classpath of your application. This is a huge advantage.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Versions update:&lt;/b&gt; Here's another big headache handled for you, especially if you have several applications that make use of a jar that you develop internally. Good dependency management keeps you from going over every application to perform version changes by hand. This will save you some real hard work and a huge amount of time.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I hope that you are already convinced that having a dependency management solution like Ivy or Maven is a good idea. Maybe you use one or the other already.&lt;br /&gt;&lt;br /&gt;Often, companies that use Maven or Ivy forget to set up a good corporate repository solution behind it all.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Building a corporate repository with Artifactory&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I've used Java corporate repository solutions such as Nexus and Archiva in the past. Recently I use only &lt;a href="http://www.jfrog.org/products.php" target="_blank"&gt;Artifactory&lt;/a&gt; and I've never had a reason to look back. &lt;a href="http://www.jfrog.org/products.php" id="n6d5" title="Artifactory"&gt;Artifactory&lt;/a&gt; is a very elegant solution to dependency management. The main issue I had with Archiva is that it downloads and resolves dependencies rather slowly.&lt;br /&gt;&lt;br /&gt;Firstly, I recommend Artifactory because it does a much better and faster job of downloading and resolving dependencies.&lt;br /&gt;&lt;br /&gt;Secondly, I heartily recommend using Artifactory because it provides a comfortable web UI for the management of your third party jars (solutions and plugins) like Spring, Hibernate, JBoss, as well as managing those that are produced in-home by your company. This separation can be done using Artifactory's repositories.&lt;br /&gt;&lt;br /&gt;Thirdly, I strongly recommend Artifactory because it provides separation and control of the many versions of development and production material. Most of the time people use Artifactory only as a proxy solution that helps you save some traffic from your company's bandwith, but it's actually much more.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dependency Control&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Artifactory allows you to control the permissions of users and groups. You decide which applications can consume or use certain repositories and jars. For example, you can restrict the use of Spring only for some projects. I wouldn't do that :) but it can be done. Artifactory also provides you with a much better way to manage your internal dependencies and the solutions you write by letting you limit and centralize access to those dependencies. You may never miss a dependency again.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;M2 and Ivy Consolidated Repository&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div id="fyq2" style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_26c4w8fpg2_b" style="height: 375px; width: 500px;" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;The figure on top shows that by using *virtual* Artifactory repositories you can serve both Ant-Ivy and Maven clients. The coolest thing is that you can serve both clients from the same repository.&lt;br /&gt;&lt;br /&gt;How is this possible? Because Artifactory is flexible.&lt;br /&gt;&lt;br /&gt;Artifactory works under the Maven 2 dependencies standard. This standard includes:&lt;br /&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;b&gt;GroupId:&lt;/b&gt; the group of the solution, macro grouping of a module, or a providing company (e.g. org.springframework)&lt;/li&gt;&lt;li&gt;&lt;b&gt;ArtifactId:&lt;/b&gt; represents or identifies the available / consumed artifact – could be the name of the jar like in our old *lib* folder (e.g. spring)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Version:&lt;/b&gt; the version of the jar (In Maven when we see something like 1.0, normally it indicates that the solution is a production release and if available, you should use GA. When a solution is under development, a SNAPSHOT version is used; sometimes followed by the date and time of the last build.)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;With Ivy things work pretty much the same in the attribute organisation maintaining a respective equivalence to Maven 2:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Organisation:&lt;/b&gt; similar to Maven GroupId&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Module:&lt;/b&gt; similar to Maven ArtifactId&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Revision:&lt;/b&gt; similar to Maven Version&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The big difference between the two Apache Dependency solutions is that Ivy uses a regex-style pattern for dependency resolution, and Maven uses a predefined pattern for dependency resolution. It's a fact that Ivy gives you more flexibility, but also demands more work. What I suggest is to use the same Maven pattern for Ivy, so deployments to Artifactory will be consistent. This way you'll be able to use the same repository for Ivy and Maven.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Configuring Ivy to download and deploy to Artifactory&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To accomplish this, all you have to do is use this XML file I've named ivy-artifactory-settings.xml:&lt;pre&gt;&lt;a name="l1"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;/a&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;ivysettings&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l2"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;settings &lt;/span&gt;&lt;span class="s3"&gt;defaultResolver=&lt;/span&gt;&lt;span class="s4"&gt;"public"&lt;/span&gt;&lt;span class="s0"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l3"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;credentials &lt;/span&gt;&lt;span class="s3"&gt;realm=&lt;/span&gt;&lt;span class="s4"&gt;"Artifactory Realm"&lt;/span&gt;&lt;span class="s0"&gt;&lt;br /&gt;&lt;a name="l4"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;/a&gt;                 &lt;/span&gt;&lt;span class="s3"&gt;host=&lt;/span&gt;&lt;span class="s4"&gt;"seu_host_do_artifactory"&lt;/span&gt;&lt;span class="s0"&gt;&lt;br /&gt;&lt;a name="l5"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;/a&gt;                 &lt;/span&gt;&lt;span class="s3"&gt;username=&lt;/span&gt;&lt;span class="s4"&gt;"admin_user" &lt;/span&gt;&lt;span class="s3"&gt;passwd=&lt;/span&gt;&lt;span class="s4"&gt;"admin_password"&lt;/span&gt;&lt;span class="s0"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l6"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;resolvers&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l7"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;/a&gt;        &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;ibiblio &lt;/span&gt;&lt;span class="s3"&gt;name=&lt;/span&gt;&lt;span class="s4"&gt;"public" &lt;/span&gt;&lt;span class="s3"&gt;m2compatible=&lt;/span&gt;&lt;span class="s4"&gt;"true"&lt;/span&gt;&lt;span class="s0"&gt;&lt;br /&gt;&lt;a name="l8"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;/a&gt;                 &lt;/span&gt;&lt;span class="s3"&gt;root=&lt;/span&gt;&lt;span class="s4"&gt;"http://seu_server:8080/artifactory/&lt;br /&gt;&lt;a name="l9"&gt;&lt;span class="ln"&gt;9&lt;/span&gt;&lt;/a&gt;                 seu_proxy_repository"&lt;/span&gt;&lt;span class="s0"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l10"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;/a&gt;        &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;url &lt;/span&gt;&lt;span class="s3"&gt;name=&lt;/span&gt;&lt;span class="s4"&gt;"publish_artifactory" &lt;/span&gt;&lt;span class="s3"&gt;m2compatible=&lt;/span&gt;&lt;span class="s4"&gt;"true"&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l11"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;/a&gt;            &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;artifactpattern=&lt;/span&gt;&lt;span class="s4"&gt;"http://seu_server:8080/artifactory/&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l12"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;/a&gt;            &lt;/span&gt;&lt;span class="s4"&gt;seu_repositorio_release_repository/[organisation]/&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l13"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;/a&gt;            &lt;/span&gt;&lt;span class="s4"&gt;[module]/[revision]/[artifact]-[revision].[ext]"/&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l14"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;/a&gt;        &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l15"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s1"&gt;resolvers&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&lt;br /&gt;&lt;a name="l16"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s1"&gt;ivysettings&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Do not forget to use the pattern [organisation]/[module]/[revision]/[type]s/[artifact]-[revision].[ext] to resolve the dependencies. By the time you are publishing your jar via Ivy, you can use a task to make the Maven POM based on Ivy's dependencies. It should be something like this:&lt;pre&gt;&lt;a name="l1"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;/a&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;ivy-makepom &lt;/span&gt;&lt;span class="s3"&gt;ivyfile=&lt;/span&gt;&lt;span class="s4"&gt;"${ivy.xml.file}"&lt;/span&gt;&lt;span class="s0"&gt;&lt;br /&gt;&lt;a name="l2"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;/a&gt;             &lt;/span&gt;&lt;span class="s3"&gt;pomfile=&lt;/span&gt;&lt;span class="s4"&gt;"${basedir}/dist/${ivy.organisation}/&lt;br /&gt;&lt;a name="l3"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;/a&gt;             ${ivy.module}/${ivy.revision}/&lt;br /&gt;&lt;a name="l4"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;/a&gt;             ${ivy.module}-${ivy.revision}.pom"&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s4"&gt;&lt;br /&gt;&lt;a name="l5"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;mapping &lt;/span&gt;&lt;span class="s3"&gt;conf=&lt;/span&gt;&lt;span class="s4"&gt;"default" &lt;/span&gt;&lt;span class="s3"&gt;scope=&lt;/span&gt;&lt;span class="s4"&gt;"compile"&lt;/span&gt;&lt;span class="s0"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="s4"&gt;&lt;br /&gt;&lt;a name="l6"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;/a&gt;    &lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s1"&gt;mapping &lt;/span&gt;&lt;span class="s3"&gt;conf=&lt;/span&gt;&lt;span class="s4"&gt;"runtime" &lt;/span&gt;&lt;span class="s3"&gt;scope=&lt;/span&gt;&lt;span class="s4"&gt;"runtime"&lt;/span&gt;&lt;span class="s0"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="s4"&gt;&lt;br /&gt;&lt;a name="l7"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="s0"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="s1"&gt;ivy-makepom&lt;/span&gt;&lt;span class="s0"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Taking into account that you created your jar in the dist folder and that it follows the Maven 2 pattern, you will notice that it's located within the hierarchy of organisation, module and version folders and that the jar is tagged with the module name and the version.&lt;br /&gt;&lt;br /&gt;Consuming and publishing your artifacts using Maven shouldn't put you to any trouble, since Ivy now follows the same pattern as Maven.&lt;br /&gt;&lt;br /&gt;So no matter if the project uses Maven 2 or Ant with Ivy, by using Artifactory and following the patterns and tips from this post, you will be able to use the same repository for everything.&lt;br /&gt;&lt;br /&gt;Best regards until next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-212739737899831410?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/212739737899831410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2010/03/building-enterprise-repository-with.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/212739737899831410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/212739737899831410'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2010/03/building-enterprise-repository-with.html' title='Building an Enterprise Repository with Artifactory'/><author><name>Noam Y. Tenne</name><uri>http://www.blogger.com/profile/01222076745659653783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_O5hJ6HfyttM/TBUf2abvGUI/AAAAAAAAABA/424pxP6_fQc/s1600-R/8f6596469d3f567585b2f5f7b19d635e.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-1465676126722908036</id><published>2010-01-14T14:26:00.005+02:00</published><updated>2010-01-14T15:27:30.160+02:00</updated><title type='text'>So you've decided to configure a remote repo and avoid headaches?!</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;b&gt;Background&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;There are a lot of public Maven 2 repositories out there (repo1, JBoss, SpringSource, etc.). When setting up your a repository manager for your organization, configuring remote repositories can be one of the most difficult tasks. Finding the correct URL for those remote repositories, and more importantly, defining the correct include/exclude patterns for artifacts, is not always a trivial thing to do.&lt;p&gt;However, we at &lt;a href="http://www.jfrog.org/" target="_blank" title="JFrog"&gt;JFrog&lt;/a&gt; believe that if you are using &lt;a href="http://www.jfrog.org/products.php" target="_blank" title="Artifactory"&gt;Artifactory&lt;/a&gt; as your repository manager, this task can become a snap using remote repository configuration sharing!&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Remote Repository Provisioning&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;To share the configuration of your remote repositories all you need to do is configure a remote repository once. Then all other Artifactories that you allow access can connect to yours and pull the remote repository configuration via REST and they are all set and ready to go in a matter of minutes! &lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:100%;"&gt;&lt;p&gt;Artifactory allows you to define include/exclude patterns on the repository level (as opposed to group level), which is important for repository configuration sharing, since it deems each remote repository responsible for a predefined set of artifacts.&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;The Process&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;The process is split into two separate parts: sharing and importing: First, you must choose which repository configurations you want to expose (you don't want to expose repositories with sensitive information) and then other Artifactories simply pull the configuration.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;1. Sharing: choose which repositories to expose&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;p&gt;Go to your Repositories page and select which remote&lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Importing+Shared+Configurations" target="_blank" title=" &amp;quot;repo&amp;quot; you would like to share"&gt; "repo" you would like to share&lt;/a&gt;. Then, in the "Advanced" area of the panel you need to select the "Share Configuration" check box and click Save. It's that easy.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: left;" id="lgxo"&gt;&lt;img style="width: 534px; height: 747px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_23dbpn2hgp_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;2. Importing: adding repositories to a new artifactory instance&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=";font-family:Verdana;color:black;"  &gt;&lt;span style="font-size:100%;"&gt;Now let's go to the other side. Let's say that you have a brand new instance of Artifactory running. In the repositories admin page you can see the default list of remote repositories. You can select these predefined common remote repositories (JBoss, SpringSource, Java.net, Google, and so on).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;div style="text-align: left;" id="phdl"&gt;&lt;img style="width: 584px; height: 190px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_26ddskpfg3_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;If you wish to update one of the repository definitions or add a new one that is not currently there all you need to do is click the "Import" button. Enter a remote Artifactory URL, or just use the default one that points to "http://repo.jfrog.org", to get a list of most common well-known repositories.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Now, click "Load".&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;You will get a list of readily available repositories is at your disposal. Simply check the ones you want, modify the repository key if needed, and import. &lt;/span&gt;&lt;span style="font-size:100%;"&gt; The process is quite easy and lightweight!&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style="font-size:100%;"&gt; &lt;div style="text-align: left;" id="h9g1"&gt;&lt;img style="width: 584px; height: 492px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_25gw9zsg8q_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Assuming you are in a large company that has several Artifactories running in multiple locations, you do not need an expert to configure those repositories again. All you need to do is connect to one central Artifactory that holds all remote repositories already configured and working, and simply pull the configuration over to your side. You are ready to go in a matter of minutes and without the headache of trying to make sure that configuration matches the one on the central Artifactory. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Remote repositories may change (often leading to a domino effect in artifacts resolution). Artifactory deals with that too by allowing a repository configuration to be overridden with a newly retrieved one. You can of course rename an imported configuration in case it conflicts with an existing configured repository.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Conclusion:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Artifactory OSS version offers a powerful way to make remote repository configuration easy, eliminating redundant maintenance pains. By following a simple and easy-to-use process the entire aspect of repository sharing becomes a no brainer.&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;That's it—enjoy and happy building!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-1465676126722908036?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/1465676126722908036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2010/01/so-youve-decided-to-configure-remote.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1465676126722908036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1465676126722908036'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2010/01/so-youve-decided-to-configure-remote.html' title='So you&apos;ve decided to configure a remote repo and avoid headaches?!'/><author><name>Tomer Cohen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_Y8Zm4RfFL38/S08TwWsQN6I/AAAAAAAACzI/Rc-42IlhIB0/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-1815546549967361900</id><published>2009-12-30T22:03:00.034+02:00</published><updated>2010-01-04T14:56:26.832+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Noam Tenne'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Empower Hudson with Artifactory - Track and Replay Your Build Artifacts</title><content type='html'>&lt;span style=";font-family:lucida grande;font-size:100%;"  &gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;Overview&lt;/span&gt;&lt;br /&gt;In this blog, I will demonstrate how to integrate &lt;a id="ffpp" title="Hudson" href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; with &lt;a id="mhhu" title="JFrog's Artifactory" href="http://artifactory.jfrog.org/"&gt;JFrog's Artifactory&lt;/a&gt; repository manager to have full build-to-artifacts traceability. We will use Artifactory plug-in to deploy the Hudson build artifacts and track them back to their original build.&lt;br /&gt;&lt;br /&gt;Keeping the history and reproducibility of code is a must-have for any modern project.&lt;br /&gt;Using one of the different flavors of version control applications, you can easily reproduce the state of any point in the past using the different methods of SCM tagging.&lt;br /&gt;&lt;br /&gt;But what happens when you want to reproduce binary products from a certain phase?&lt;br /&gt;Are dependencies considered? Does anyone really remember what version of dependency X was used in version 1.0 or in version 3.1 of your application? What if you used version ranges or dynamic properties? Was the application compiled using JDK 5 or 6?&lt;br /&gt;&lt;br /&gt;All this information can be recorded during the publication of your binaries, which is usually done by a CI server of your choice.&lt;br /&gt;Your CI server has all the knowledge required in order to reproduce a build:&lt;br /&gt;&lt;/span&gt; &lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;/div&gt; &lt;ul  style="font-family:lucida grande;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Information on the builds themselves &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The published items &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Version information &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Dependencies &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Build environment details &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:lucida grande;font-size:100%;"  &gt;But how can you capture all this data? This is where Artifactory kicks in!&lt;br /&gt;&lt;br /&gt;Artifactory (v2.1.3+ OSS) is open for communication from any build process to receive information needed for tracing/reproducing a build - the sender of this information is typically your build server!&lt;br /&gt;The information is transferred &lt;/span&gt;&lt;span style=";font-family:lucida grande;font-size:100%;"  &gt;via REST&lt;/span&gt;&lt;span style=";font-family:lucida grande;font-size:100%;"  &gt; in the form of a BuildInfo JSON object and contains details about the modules, artifacts, dependencies, environments, properties, and more.&lt;br /&gt;All builds and binaries are provided with bi-directional links that enable you to reproduce and analyze the impact of any action. &lt;/span&gt;&lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;Presently, JFrog provides a first integration with Hudson and Maven 2. Other technology stacks are coming, but for the purpose of this blog I will use a setup of Hudson with a Maven 2 build.&lt;br /&gt;&lt;br /&gt;So let's get "crackin'"!&lt;br /&gt;&lt;br /&gt;We assume that your instance of Hudson is already configured to request all it's dependencies from Artifactory. This of course ensures that all your build's dependencies are cached in Artifactory and can be used for build reproducibility. &lt;/span&gt;&lt;/div&gt;   &lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b style="font-style: italic;"&gt;Installing Hudson's Artifactory Plug-in&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;To install the Artifactory plug-in, simply browse from the main menu to "Manage Hudson" -&gt; "Manage Plugins" -&gt; "Available" Tab, and check to enable "Artifactory Plug-in". Once the plug-in has been downloaded and installed, restart Hudson for the changes to take effect.&lt;br /&gt;&lt;br /&gt;Now we'll configure the plug-in on a system-wide level and point it to the Artifactory to which we would like to publish the information (please note that Artifactory should be running and available at this point).&lt;br /&gt;To do this, enter the "Configure System" menu via "Manage Hudson" -&gt; "Configure System", and then configure the URL (up to the application context name, like "http://localhost:8081/artifactory"), and optional credentials (if anonymous access is enabled, you don't need to provide them). The need for credentials of an authenticated user comes from the fact that Hudson requests a list of deployable repositories from Artifactory, so you can choose the destination of your binaries at a later stage.&lt;br /&gt;Notice that you can add multiple Artifactory configurations to suit your needs.&lt;br /&gt;&lt;br /&gt;Next, we'll configure the plug-in at the "Job" level.&lt;br /&gt;Enter the Job configuration by selecting your Job and clicking the "Configuration" link. Scroll down to the &lt;b&gt;Post-build Actions&lt;/b&gt; option group, and select "Deploy artifacts to Artifactory". Once selected, the menu will expand and will let you choose the "Artifactory server" and "Target repository" to which to deploy. As implied by the field names and the "Deployer username" and "Deployer password" credentials you provide, you must have "Deploy" permission on the target repository you select.&lt;br /&gt;Being able to select your deployment target from a ready-made list, which is received directly from Artifactory, helps you avoid the pitfall of configuring your "Distribution Management" with typos.&lt;br /&gt;&lt;br /&gt;The Artifactory plug-in deploys via REST API, which optimizes the process of unique/non-unique snapshots and doesn't require credential and distribution management configuration in your settings.xml and POM files.&lt;br /&gt;Unlike Maven, which deploys each module as its build is completed (which may result in a partial deployment of your project's artifacts if your build fails at some point), the Artifactory plug-in deploys only when the entire build completes successfully (much like the built-in Hudson deployer). Each deployed artifact is tagged with buildName and buildNumber properties, and finally the Build Info is published.&lt;br /&gt;&lt;br /&gt;At this point, you can run your Job, and then view the "Console output" to see the deployment and build info publication log messages.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="a6kx" style="text-align: left;"&gt;&lt;a href="javascript:ShowPic(1);"&gt;&lt;img style="width: 584px; height: 228px;" src="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_12hh7rn8fq_b" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;&lt;br /&gt;Artifactory's Build Management&lt;/span&gt;&lt;br /&gt;Now that the Job is complete, the artifacts are deployed, and the build info is published, we can view the build info in Artifactory by clicking the "Artifacts" tab under the new "Browse:Builds" sub-menu. &lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;Here, we can see a list of all the published build names and the time each was last built.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:lucida grande;"&gt;&lt;span style="font-size:100%;"&gt;Drilling down through the build number list, we can view the general info, the published modules, and the XML representation of the selected build.&lt;br /&gt;Notice that the top of the build browser displays navigable breadcrumbs that are also synchronized with a RESTful URL that provides easy access to every part of every build.&lt;br /&gt;The general info tab displays the main details about the build (name, number, type, etcetera) properties that were attached, and even the option to save the published module's artifacts and dependencies as saved search results (requires the "Smart Searches" add-on).&lt;br /&gt;&lt;br /&gt;Clicking on the name of a module displays a list of the artifacts and dependencies that are part of the selected module.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="javascript:ShowPic(2);"&gt;&lt;img style="width: 584px; height: 273px;" src="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_14d4wzg8dh_b" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div  style="font-family:lucida grande;"&gt;&lt;div style="text-align: left;" id="d5md"&gt; &lt;div style="text-align: left;" id="o5l-"&gt;&lt;div id="v1bj" style="text-align: left;"&gt;&lt;a href="javascript:ShowPic(3);"&gt;&lt;img style="width: 584px; height: 272px;" src="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_16t9dx37cm_b" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;/div&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;When deleting an artifact that's associated with a build, either as a product or a dependency, Artifactory will notify you of the association prior to the removal.&lt;br /&gt;&lt;br /&gt;Promotion of published modules is also made possible by the "Save search results" actions that are available through the General Build Info tab (requires the "Smart Searches" add-on).&lt;br /&gt;Moreover, buildName and buildNumber properties, allows us to manually search build artifacts through the Property Searcher (requires the "Properties" add-on).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-size:130%;" &gt;Conclusion&lt;/span&gt;&lt;br /&gt;Using Hudson (and others to be supported soon) and Artifactory we've:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: lucida grande;"&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/div&gt; &lt;div face="lucida grande"&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Supplied Hudson with all the needed dependencies from Artifactory—helping us keep the exact dependencies that were used in each build&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Deployed all produced binaries to Artifactory—helping us keep and promote all the products of the build&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Published build information to Artifactory—helping us manage and keep track of every build, environment, product, and dependency&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; &lt;span style=";font-family:lucida grande;font-size:100%;"  &gt;With the assistance of these tools and methods, you will be able to reproduce and execute a build from any point of recorded time or compare information between different builds.&lt;br /&gt;You may want to visit our build integration &lt;a id="wax4" title="wiki page" href="http://wiki.jfrog.org/confluence/display/RTF/Build+Integration" target="_blank"&gt;wiki page&lt;/a&gt; for a more in-depth explanation of the process.&lt;br /&gt;&lt;br /&gt;Have fun, and be careful not to break the build. ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://www.jfrog.org/js/JFrog.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;hs.graphicsDir = 'http://www.jfrog.org/js/graphics/';hs.align = 'center';hs.transitions = ['expand', 'crossfade'];hs.outlineType = 'rounded-white';hs.fadeInOut = true;hs.addSlideshow({interval:5000,repeat:false,useControls:true,fixedControls:'fit',overlayOptions: {opacity: .75,position: 'bottom center',hideOnMouseOut: true}});function ShowPic(id){hs.expand(document.getElementById('img-'+id));}&lt;/script&gt;&lt;br /&gt;&lt;div class="highslide-gallery" style="display: none;"&gt;&lt;br /&gt;   &lt;a id="img-1" href="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_13gszzrsg4_b" onclick="return hs.expand(this)"&gt;&lt;/a&gt;&lt;br /&gt;   &lt;div class="highslide-heading"&gt;&lt;br /&gt;       Hudson    &lt;/div&gt;&lt;br /&gt;&lt;a id="img-2" href="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_15grpnpzc2_b" onclick="return hs.expand(this)"&gt;&lt;/a&gt;&lt;br /&gt;   &lt;div class="highslide-heading"&gt;&lt;br /&gt;       Published Modules    &lt;/div&gt;&lt;br /&gt;&lt;a id="img-3" href="http://docs.google.com/a/jfrog.org/File?id=dc885b7m_17c84b3zdv_b" onclick="return hs.expand(this)"&gt;&lt;/a&gt;&lt;br /&gt;   &lt;div class="highslide-heading"&gt;&lt;br /&gt;       Builds Tab    &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-1815546549967361900?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/1815546549967361900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/12/empower-hudson-with-artifactory-track.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1815546549967361900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1815546549967361900'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/12/empower-hudson-with-artifactory-track.html' title='Empower Hudson with Artifactory - Track and Replay Your Build Artifacts'/><author><name>Noam Y. Tenne</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://2.bp.blogspot.com/_1TdvNaeazDI/Szt40Pu0eoI/AAAAAAAAAAM/7Kyt8CqypIs/S220/DSC_0040.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-6466640112377745314</id><published>2009-12-24T11:03:00.003+02:00</published><updated>2009-12-27T11:31:14.350+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>The one that talks, the one that does!</title><content type='html'>In a blog "&lt;a href=http://www.sonatype.com/people/2009/02/why-putting-repositories-in-your-poms-is-a-bad-idea/ id=vw3- title="Why Putting Repositories in your POMs is a Bad Idea"&gt;Why Putting Repositories in your POMs is a Bad Idea&lt;/a&gt;", Sonatype "asked" the open source community to manage their Maven2 POM file correctly.&lt;br /&gt;&lt;br /&gt;This is a good and important request, since Maven will not work correctly:&lt;ul&gt;&lt;li&gt;Over time (due to URL changes)&lt;/li&gt;&lt;li&gt;In a closed environment (no direct access to the Internet from a developer machine)&lt;/li&gt;&lt;li&gt;Because it will shortcut the repository manager of your choice (Nexus, Archiva, or Artifactory) for resolving dependencies—this is most important.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;We are facing this problem for almost every customer that uses Maven, and most of them are using the lazy and dirty solution of "&lt;a href=http://wiki.jfrog.org/confluence/display/RTF/Configuring+Artifacts+Resolution id=z522 title=mirrorOf&gt;mirrorOf&lt;/a&gt;". It is argued in the blog that mirroring all Maven requests to a single URL is a good idea: We know it is a bad idea as it completely takes away control of isolating the source for releases, snapshots, and plug-ins!&lt;br /&gt;&lt;br /&gt;There is however, a dramatic sentence in the blog about POM files coming from Open Source projects (it actually applies to everyone):&lt;br /&gt;  &lt;i&gt;"The entries you have defined will be &lt;b&gt;burned forever&lt;/b&gt; into your released POMs."&lt;/i&gt;&lt;br /&gt;It sounds like Maven is broken by design and forever, because of all the bad POM files that already exist out there.&lt;br /&gt;&lt;br /&gt;Since we support our customers, and they are suffering from actions that are not under their control, we decided to fix it.&lt;br /&gt;&lt;br /&gt;In the latest version of Artifactory (2.1.3), there is now a &lt;a href=http://wiki.jfrog.org/confluence/display/RTF/Virtual+Repositories#VirtualRepositories-pomcleanup title="new feature"&gt;new feature&lt;/a&gt;: &lt;b&gt;Automatic cleanup of remote repositories declared in POMs.&lt;/b&gt;&lt;br /&gt;You can now configure any virtual repository to automatically clean up rogue remote repositories declared in POM files.&lt;br /&gt;&lt;br /&gt;By default, Artifactory will do it for repositories and plug-in repositories directly declared under the project POM entity, or declared inside an active-by-default profile. You can enforce a deeper cleanup that removes all repository and plug-in repository declarations in all profiles.&lt;br /&gt;&lt;br /&gt;Using Artifactory as your repository manager means that you will never get "&lt;i&gt;&lt;b&gt;burnt forever&lt;/b&gt;&lt;/i&gt;" by innocent mistakes done in POM files of nice, popular Open Source projects.&lt;br /&gt;&lt;br /&gt;  &lt;i&gt;"The one that talks, the one that does!"&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-6466640112377745314?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/6466640112377745314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/12/one-that-talks-one-that-does.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/6466640112377745314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/6466640112377745314'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/12/one-that-talks-one-that-does.html' title='The one that talks, the one that does!'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-2972904987634625080</id><published>2009-11-05T13:31:00.020+02:00</published><updated>2009-11-07T00:25:56.905+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='staging'/><category scheme='http://www.blogger.com/atom/ns#' term='Yoav Landman'/><category scheme='http://www.blogger.com/atom/ns#' term='promotion'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Search-based Promotion - Staging and Promotion Finally Made Simple!</title><content type='html'>&lt;span style="font-weight:bold;font-style:italic;"&gt;Overiew&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the greatest features of Artifactory 2.1 is the support for artifacts staging and promotion.&lt;br /&gt;The idea behind this feature is that in many environments, before exposing a new release for public consumption, the release needs to go through a well-known life-cycle - the release is first made available in a staging environment where it is validated and undergoes final QA, only then it is moved or 'promoted' to a place where it can be found and used by clients.&lt;br /&gt;&lt;br /&gt;In the world of releasing artifacts this means that when to-be-released artifacts are built and deployed into Artifactory, you want them to first to be accessible only by a selected group (staging). It is only when the artifacts have been 'blessed' and found to be release-ready, that you can change their access-level and make them available for download by a wider audience (promotion).&lt;br /&gt;&lt;br /&gt;There are two problems with managing staging and promotion. The first problem is around identification - how can we manage and identify a group of artifacts deployed to Artifactory by the same build, in order to promote them later on as a single unit.&lt;br /&gt;The second problem is about promotion composition - once to-be-promoted artifacts can be identified, what is the best way to collect them and change their visibility. Also, what if you wish to be picky about promotion. For example - what if you want to sieve test artifacts from the release or remove by hand an internal artifact that was originally part of the deployed files?&lt;br /&gt;&lt;br /&gt;The solution described here takes advantage of one of Artifactory's coolest features - the ability to attach properties on artifacts and the ability to compose and operate on search results. It uses some features found in the &lt;a href="http://www.jfrog.org/addons.php"&gt;Artifactory Add-ons Power Pack&lt;/a&gt;, but with some additional setup it can also be adapted to the open source version of Artifactory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Identifying Artifacts Deployed as a Group&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Quarantine Way&lt;/span&gt;&lt;br /&gt;One way of identifying same-build artifacts is by creating isolation: you create a "quarantine repository" per-build and deploy your artifacts to it. This guarantees that artifacts are isolated in a confined place where they can be identified. The next step is to make the quarantine repository visible to your staging clients.&lt;br /&gt;The main problem with this approach is that it somewhat a heavyweight solution:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You need to create a pseudo repository on-the-fly, usually using a cryptic handle (such as a time stamp and the originating IP address) which makes it complicated to remember and identify later on.&lt;/li&gt;&lt;li&gt;For each such temporary repository you need to configure how it will be exposed under a more user-friendly repository and who will have permissions to view it.&lt;/li&gt;&lt;li&gt;You need to manage the repository and decide when to close it and how long it needs to be kept.&lt;/li&gt;&lt;/ul&gt;So, we decided we don't want to go this way of creating a quarantine area and introducing unnecessary maintenance efforts. Moreover, the whole concept of creating an on-the-fly repository for the sake of supporting promotion, just felt unnatural to us! What we really wanted to do instead is to be able to deploy our artifacts to a normal managed repository accessible by the QA users. Then, we wanted to find in this repository all the artifacts that were deployed by the same build and promote them as one unit to a different repository. If we could also have a way to do some manual artifacts filtering before promotion this would also be nice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Meet Artifacts Tagging&lt;/span&gt;&lt;br /&gt;Artifactory supports attaching properties to artifacts (and folders). You can search for property values and retrieve artifacts that were tagged with properties. So, if we could somehow attach properties to our build artifacts at build-time in a simple manner, then we can use these properties to locate and identify the deployed artifacts originated from the same build for the sake of promoting them later on.&lt;br /&gt;Properties can be attached to artifacts in many ways: via the UI (the Artifactory Properties add-on allows you to attach custom strongly-types properties), via REST API using PUT requests and as a piggy-back to artifacts PUT requests using matrix parameters.&lt;br /&gt;We are going to use the last method to transparently tag our artifacts as they are deployed to Artifactory by the build process. To accomplish this, all we need to do is add matrix parameters to the deployment URL, as part of our POM's 'distributionManagement' section:&lt;br /&gt;&lt;pre&gt;&amp;lt;distributionManagement&amp;gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;qa-releases&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;url&amp;gt;&lt;br /&gt;   http://myserver:8081/artifactory/qa-releases; \&lt;br /&gt;   buildNumber=${buildNumber}; \&lt;br /&gt;   revision=${revision}&lt;br /&gt;   &amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/distributionManagement&amp;gt;&lt;/pre&gt;&lt;br /&gt;Matrix parameters are a set of key-value pairs separated by semicolon (;) and are a standard HTTP way for specifying parameters (in addition to query parameters and path parameters).&lt;br /&gt;&lt;br /&gt;In our example, we added two parameters to the deployment URL: buildNumer and revision, both will be replaced by Maven in deployment time with dynamic values from our project properties (e.g. by using the &lt;a href="http://mojo.codehaus.org/buildnumber-maven-plugin/"&gt;Maven build-number plugin&lt;/a&gt;). When building a multi-module project all the artifacts deployed from the parent project will end up having the same buildNumber and revision values. When Artifactory sees the values as part of the URL it automatically attaches new properties with the supplied key/values to the deployed artifacts.&lt;br /&gt;This mechanism works with any Artifactory 2.1+, without having to install any add-on. It also works with any REST client, which means you do not have to customize Maven or use a Maven plugin - it just works out-of-the-box.&lt;br /&gt;&lt;br /&gt;The artifacts in this example are deployed to the 'qa-releases' local repository, which is our common place for staging artifacts before they undergo final testing and approval by the QA team.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Composing And Promoting Artifacts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Goal - Search and Move&lt;/span&gt;&lt;br /&gt;So, we managed to have all our build artifacts tagged with properties and deployed into the staging area. Next the QA team has gone through all known issues and approved our artifacts for further distribution to clients. We now need to find a way to copy or move our artifacts to another area where they can be downloaded by these clients. In fact, we can think of 'promotion' as a fancy term for moving (or copying) artifacts to a different place where different access rules apply.&lt;br /&gt;&lt;br /&gt;So, what we really need to do is search for our recently deployed artifact by their build number property and then move the result to another repository.&lt;br /&gt;One way to do this is via REST API - search for artifacts by metadata (properties are stored internally as XML metadata) and send DAV MOVE requests to move the results one by one. This will require writing a small external script to send the relevant HTTP queries and can be done using the basic open source Artifactory version. However, there is a much simpler and more powerful way to do this inside Artifactory itself, which involves the 'Smart Searches' and 'Properties' add-ons.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Finding To-Be-Promoted Artifacts - Meet Smart Searches and Properties&lt;/span&gt;&lt;br /&gt;The idea behind smart searches is as follows:&lt;br /&gt;You collate artifacts by searching - start with performing a search, then save the search results found into a named 'search result'. A 'search result' is merely a collection of found items. You can now perform additional searches, and for each search you can choose whether to create new search results or, more interestingly, add or subtract the items found to/from any previously saved search result. You can combine artifacts from any search type (simple, GAVC, class, XML etc.)  - the combinations are really unlimited!&lt;br /&gt;&lt;br /&gt;In our case we will simply run a property search for all artifacts deployed with a certain build number (tagged in deployment with the buildNumber property). For this, we will use the Properties search user interface:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_14d7mhkwc5_b"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 455px; height: 283px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_14d7mhkwc5_b" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We will then save our results as a new search result called 'to-be-promoted'. We can perform other searches to add or remove artifacts from the saved results.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_10gwwnhhcz_b"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 455px; height: 346px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_10gwwnhhcz_b" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can even manually tweak our saved results by discarding specific artifacts - say one artifact in the build needs to be closed source, we can discard the sources form the results (if we wanted to discard all sources we could do this easily by subtracting the results of a GAVC search for the 'sources' classifiers - see the screenshot below).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_15gqxxr7fx_b"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 455px; height: 280px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_15gqxxr7fx_b" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once we are happy with our saved search results, we can go on and promote them!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Promotion - Just Move It!&lt;/span&gt;&lt;br /&gt;Promotion is super easy - we just move the saved search results artifacts to a target, more open, repository, thus making them available for public consumption. We can choose whether to move the original artifacts or create a copy of them in the destination repository.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_12cwxc93db_b"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 455px; height: 358px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_12cwxc93db_b" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can even perform a 'dry run' to see that everything moves fine and we have no errors or warnings (for example, the destination repository might not accept some artifacts due to it snapshots/releases policy, security policies or include/exclude path patterns).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_13c7cbc8gp_b"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 455px; height: 300px;" src="http://docs.google.com/a/jfrog.org/File?id=dcvk2pm_13c7cbc8gp_b" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, we can also export the search result artifacts to the file system if we wish to use them elsewhere outside Artifactory.&lt;br /&gt;When search results are copied ro moved they maintain their original metadata and properties, so any valuable information you might have on your artifacts is kept.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-style:italic;"&gt;Wrapping Up&lt;/span&gt;&lt;br /&gt;Artifactory is taking a unique approach towards staging and promotion - instead of artificially requiring artifact to be deployed into a quarrantine area, we simply tag artifacts with metadata upon deployment and have them deployed to a central staging repository that is accessible internally to the development and the QA team members. This process is cheap, doesn't require complicated setup and is natural to both developers and testers. If we wish to avoid double-deployments to the staging repository we can easily do it using permissions (using the delete privilege) - there no need to manually close the whole repository for this.&lt;br /&gt;Once we are happy with the staging build artifacts, we can collect them by searching and simply move or copy them to another target repository where they are publicly available. In this example we tagged our artifact with a buildNumber property which we searched for later, but we could attach any properties to our artifacts and perform many kind of searches to control our promotion source (by combination of property values, by GAVC etc.) - with metadata on artifacts we are not limited by the physical repository our artifacts were deployed into!&lt;br /&gt;&lt;br /&gt;Finally, we created a &lt;a href="http://www.jfrog.org/screencast.php?id=fAwuVImsVc8"&gt;screencast&lt;/a&gt; showing the promotion methodology described here, in action.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-2972904987634625080?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/2972904987634625080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/11/search-based-promotion-staging-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2972904987634625080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/2972904987634625080'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/11/search-based-promotion-staging-and.html' title='Search-based Promotion - Staging and Promotion Finally Made Simple!'/><author><name>Yoav Landman</name><uri>http://www.blogger.com/profile/04609544830985043196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_a5tMhAMGeN0/S458ju-vC9I/AAAAAAAAAGc/tctBm9XFIjI/S220/yoav.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-5429906541494518240</id><published>2009-05-11T23:06:00.006+03:00</published><updated>2009-12-31T12:18:14.512+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaone'/><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Maven and JavaFX, the story of TwitterFX POM</title><content type='html'>&lt;h4&gt;JavaOne demo&lt;/h4&gt;&lt;br /&gt;Our JavaOne 2009 technical presentation &lt;a href="http://www28.cplan.com/cc230/session_details.jsp?isid=304388&amp;amp;ilocation_id=230-1&amp;amp;ilanguage=english"&gt;TS-4388&lt;/a&gt; is a demo integrating Maven, JavaFX, Artifactory and WebStart in one smooth process for the developer and site operation manager.&lt;br /&gt;So, we were looking for a nice JavaFX demo with source code using external Java dependencies that will demonstrate the ease of use of Maven when using Java libraries. From the &lt;a href="http://java.sun.com/developer/technicalArticles/javafx/AppORama/"&gt;JavaFX Application contest&lt;/a&gt; and from some Twitter news we tried &lt;a href="http://kenai.com/projects/twitterfx"&gt;TwitterFX&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://kenai.com/projects/twitterfx"&gt;&lt;img src="http://www.jfrog.org/images/TwitterIcon256x256_bigger.png" alt="TwitterFX"/&gt;&lt;/a&gt;&lt;br /&gt;We were immediately impressed by the UI quality and slickness of this application: Bravo!&lt;br /&gt;So we checked out the &lt;a href="http://kenai.com/projects/twitterfx/sources/"&gt;source code&lt;/a&gt;, and we saw the need for Maven on this project. All the dependent jars were included in Subversion (3.1M of jars out of a 4.2M project: 74%), and the generated build scripts generated by Netbeans are hard to maintain for users without the IDE. Managing Hudson builds without NetBeans becomes almost impossible.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JavaFX and Maven&lt;/h4&gt;&lt;br /&gt;We looked for java developers that already tried to merge these 2 technologies, and found out that few actually succeeded. We were looking for a clean integration with minimal POM configuration.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;For compiling JavaFX code, we found:&lt;ul&gt;&lt;li&gt;An outdated &lt;a href="http://sourceforge.net/projects/m2-javafxc"&gt;Plexus JavaFX compiler plugin&lt;/a&gt; that replaced the java compiler. The issue with it is that we &lt;a href="http://www.experts-exchange.com/Programming/Languages/Java/J2SE/Q_24390743.html"&gt;could not mix java and javafx code&lt;/a&gt; in the same project.&lt;/li&gt;&lt;li&gt;You can also use the &lt;a href="http://www.jroller.com/alexRuiz/entry/testing_javafx_uis_part_4"&gt;antrun plugin&lt;/a&gt; to activate the javafxc Ant task from Maven. The configuration is very verbose and the integration with the Maven model is minimal.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;For generating JNLP files, the &lt;a href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/"&gt;WebStart plugin&lt;/a&gt; is working correctly but it is flattening the references to external jars. It means that all dependent jars are copied in the same folder than the jar of your application. We want to avoid the duplication of jars in the end user WebStart cache, so we liked to use the maven repository layout format for referencing jars.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So, we wrote 2 Maven plugins:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.jfrog.org/confluence/x/DQCO"&gt;JavaFX Compiler Maven Plugin&lt;/a&gt;: compile javafx source files without interfering with the java compiler. It activates the javafxc Ant task using the Maven model to fill the classpath and other parameters.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.jfrog.org/confluence/x/DwCO"&gt;JNLP Generator Maven Plugin&lt;/a&gt;: The plugin will activate Velocity to generate a JNLP file out of the master template and all Maven model data (your project information) and especially maven runtime dependencies. The generated JNLP file will be distributed by Maven automatically.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;We used them first on the small demo that depends only on the JavaFX platform, then we used them to "Mavenize" the TwitterFX code base.&lt;br /&gt;So, &lt;a href="http://subversion.jfrog.org/jfrog/twitterfx"&gt;here&lt;/a&gt; is the source code for the Maven version of TwitterFX. In this check out there are &lt;b&gt;no jars&lt;/b&gt; in Subversion, &lt;b&gt;no Ant&lt;/b&gt; build script, and &lt;b&gt;no classpath&lt;/b&gt;. There was 500 lines of Ant code (XML and properties files, managed and generated by NetBeans), that became 200 lines in the POM file (and can be a lot smaller). The main difference is that the POM file is readable and maintainable.&lt;br /&gt;To build it, you'll need java 6, Maven 2.0.9 or above (2.1 recommended) and to run "mvn -Pjfrog install".&lt;br /&gt;We still have one issue today: It is not possible to create a Maven AND JavaFX project inside NetBeans (&lt;a href="http://groups.google.com/group/javaposse/browse_thread/thread/f862b782de787bfd"&gt;NetBeans: Maven + JavaFX project? - The Java Posse | Google Groups&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Deploying the Application&lt;/h4&gt;&lt;br /&gt;In a modified version of &lt;a href="http://www.jfrog.org/products.php"&gt;Artifactory&lt;/a&gt; we are managing WebStart requests toward JNLP and jar files. This extension provides codebase modification of JNLP file attribute based on the server settings, and on-the-fly signing of the main jar and its dependencies. If you deployed a JNLP applet you can even preview it directly from Artifactory!&lt;br /&gt;&lt;br /&gt;Using the Maven 2 repository layout to reference third party jars allows the end user WebStart cache to reuse the dependent jars URL. To avoid users re-downloading common jars between javafx examples, the javafx.com demo files are all uploaded at the root of this server!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javaone" target="_blank"&gt;&lt;img src="http://www.cplan.com/javaone2009/creativetoolbox/images/09J1_200x200_Speaker_Button_Duke.gif" alt="I'm Speaking At JavaOne" border="0" height="200" width="200" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-5429906541494518240?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/5429906541494518240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/05/maven-and-javafx-story-of-twitterfx-pom.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5429906541494518240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5429906541494518240'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/05/maven-and-javafx-story-of-twitterfx-pom.html' title='Maven and JavaFX, the story of TwitterFX POM'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-1826893623574721674</id><published>2009-01-25T12:35:00.009+02:00</published><updated>2009-01-26T18:38:37.105+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yoav Landman'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Re: Contrasting Artifactory and Nexus</title><content type='html'>I do not care too much about product comparisons coming from product vendors since they are usually biased and written with a single mindset of "how do I make my product look better". Being labeled with an "I'm nonobjective" sticker from the start, I tend to take them with limited trust.&lt;br /&gt;&lt;br /&gt;I recently came across a &lt;a href="http://blogs.sonatype.com/people/2009/01/contrasting-nexus-and-artifactory/" target="_blank"&gt;blog post&lt;/a&gt; from Brian Fox of Sonatype, which ships Nexus Pro, a competing product to Artifactory, trying to contrast the two products. We, at JFrog, actually like and thrive from this competition as it is giving us a lot of motivation and directions on how to become even better. However, the comparison done in this blog is actually not a very useful one. Not only it is written with the prime goal of looking for cons in Artifactory, but unfortunately (or, actually, fortunately for Artifactory) almost all points brought up range from plain wrong to just pure FUD.&lt;br /&gt;&lt;br /&gt;Let's look at each point at its turn:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;1. Network: WebDAV vs. REST&lt;/span&gt;&lt;br /&gt;The author suggests Artifactory uses WebDAV with Maven. This is plain wrong! I don't know where this "fact" was taken from, but it is just not true - Artifactory exposes a pure HTTP/REST interface (GET/PUT) which is used by the HTTP wagon of Maven.&lt;br /&gt;Maybe this poor assessment came from the fact that Artifactory also offers WebDAV clients support, but this is an extra feature, on top of HTTP/REST support.&lt;br /&gt;So, assuming that Artifactory will be slower, like the author did (because they tried WebDAV in the past and found it slow) is completely irrelevant.&lt;br /&gt;BTW, while we're at it, we have found the Maven WebDAV wagon to perform much better with huge file deployments and to consume considerably less memory on the client side.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2. Storage: Relational Database vs. Filesystem&lt;/span&gt;&lt;br /&gt;For some reason, the author is tossing away the robust architecture used by other, much more widely used, repositories, such as: SVN, YUM, APT-GET to name a few.&lt;br /&gt;Magical tales about "re-healing" of lost metadata do not work when this metadata is not reproducible from pure file data (like file name and path). Metadata has to travel with the data as one unit. If I want to know who originally deployed an artifact, there is no way I can restore this piece of information from the file name.&lt;br /&gt;There is more to it, like when you delete and artifact, Artifactory makes sure that both you deletion, the maven-metadata and the indexes are updated as one transaction - no need to schedule jobs or manually fix annoying inconsistencies that will break your build later on.&lt;br /&gt;The Artifactory 2 storage is rock solid today, and we also fully support incremental backups (including incremental metadata). A disk error could make your complete storage become unreadable (at least without complex recovery efforts, LVM anyone?) and I would like to meet in person a CM who doesn't take backups. Sorry, but saying that your data is at risk because you are using a database store is nothing but FUD.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3. Storage Size&lt;/span&gt;&lt;br /&gt;This might be true and might be attributed to several reasons, like keeping richer indexes. Anyway, unless you are running on a 3 years old machine, then frankly, who cares? Really, would your criteria for selecting one product above the other would be because one uses a couple of few gigs less storage space? If yes, I suggest you check the hard drives available today on both server and consumer machines. Same goes for consuming&gt;64MB of RAM (though we do run Artifactory with the default VM heap). Come on...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4. Nexus Doesn’t Interfere&lt;/span&gt;&lt;br /&gt;By default, Artifactory takes a conservative approach towards repository pollution, and is trying to shield you from some of the chaos that is going around the Maven central repository, mainly with older legacy artifacts. Most of the wrong POM specifications can be found duplicated on repo1 under the correct coordinates, so Artifactory produces a meaningful error, urging you to correct your POM spec.&lt;br /&gt;Anyway, this protection can be easily switched off by going to the artifactory.system.properties file and commenting out the line that says: artifactory.maven.suppressPomConsistencyChecks=true. So again, this is irrelevant.&lt;br /&gt;&lt;br /&gt;Sure, the comparison made by the Sonatype blog is nonobjective. It is natural for a competitor and, of course, I wouldn't expect it to mention pros about Artifactory like simplicity and excellent user experience, integrated UI driven LDAP integration that you don't have to shell out $3,000 for, support for encrypting user passwords in settings.xml, find and remove legacy deployed modules across directories, single deployment for a bundle of artifacts, local repositories import, etc. But, this comparison is also irrelevant, since it relies on wrong or missing information and sometimes on pure FUD.&lt;br /&gt;&lt;br /&gt;We do have a lot of appreciation to you at Sonatype for all your contribution around the Maven ecosystem. It's also natural that you want to push your commercial product, but it is very unfortunate when you decide to promote your product by trying to make other products look bad. It's also a shame, that instead of putting valuable time into developing new great features for Artifactory, I have to use this time for clearing up this kind of wrong information. There's a whole community enjoying our efforts, so let's give them good open source products and invest the time in productive directions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-1826893623574721674?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/1826893623574721674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/01/contrasting-artifactory-and-nexus.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1826893623574721674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/1826893623574721674'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/01/contrasting-artifactory-and-nexus.html' title='Re: Contrasting Artifactory and Nexus'/><author><name>Yoav Landman</name><uri>http://www.blogger.com/profile/04609544830985043196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_a5tMhAMGeN0/S458ju-vC9I/AAAAAAAAAGc/tctBm9XFIjI/S220/yoav.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-5100348772530084810</id><published>2009-01-25T01:41:00.018+02:00</published><updated>2009-01-25T02:19:06.126+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yoav Landman'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Avoiding Clear Text Passwords in Maven</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;On Secure LDAP Integration:&lt;/span&gt; Avoiding Clear Text Passwords in Maven Settings and Controlling Login Fallback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First, Some Background&lt;/span&gt;&lt;br /&gt;One shortcoming of Maven is that it requires you to store your repository passwords in clear text inside the settings.xml file. Now, this stops being mere annoyance and starts becoming a real security hole once your repository's authentication is done by integrating with an external security service, such as LDAP. SSL can help you overcome transmitting your password in clear text, but storing your LDAP/Active Directory password in clear text is a different story, as it opens the door for anyone who grabs your settings file to all resources accessible by you on the organizational network: email accounts, shared documents, backoffice applications etc. Certainly not a welcome side-effect.&lt;br /&gt;&lt;br /&gt;Artifactory includes an out-of-the-box LDAP integration, that can be quite easily set up and tested from the web UI. Soon after introducing LDAP into Artifactrory, we received an inspiring &lt;a href="http://issues.jfrog.org/jira/browse/RTFACT-1191"&gt;feature request&lt;/a&gt; from Patrick Crocker, that led us to implement the current encrypted password support which overcomes this security hole in Maven.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;BTW, you can use encrypted passwords &lt;span style="font-style: italic;"&gt;even without LDAP&lt;/span&gt;, of course, for just not letting people seeing what your clear text passwords look like.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How Does It Work?&lt;/span&gt;&lt;br /&gt;First, an Artifactory admin has to enable password encryption by going to Admin:Security:General and setting the password encryption policy to either "Supported" or "Required":&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_a5tMhAMGeN0/SXutUxZ8OOI/AAAAAAAAAAU/tt7coR_emWM/s1600-h/Picture+3.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 178px;" src="http://1.bp.blogspot.com/_a5tMhAMGeN0/SXutUxZ8OOI/AAAAAAAAAAU/tt7coR_emWM/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5295016359275280610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;This activates secure password generation for each user based on a secure key stored as part of the user's details.&lt;br /&gt;From now on, any user can use his profile page (your login name on the upper-right corner) to get an auto generated Triple DES secure password to use in his settings.xml file -&lt;br /&gt;just type in your current password and take your secure password for the Encrypted Password field.&lt;br /&gt;Artifactory also gives you a sample server xml element snippet for use your settings.xml.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_a5tMhAMGeN0/SXutrti_UZI/AAAAAAAAAAc/H4k2g-wxA1o/s1600-h/profile.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 292px;" src="http://3.bp.blogspot.com/_a5tMhAMGeN0/SXutrti_UZI/AAAAAAAAAAc/H4k2g-wxA1o/s400/profile.jpg" alt="" id="BLOGGER_PHOTO_ID_5295016753376481682" border="0" /&gt;&lt;/a&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Controlling Login Fallback&lt;/span&gt;&lt;br /&gt;A common case that often appears when integrating with an external authentication system is that you want to force all users to go exclusively through LDAP, except for a couple of special users that need to be able to log in using internal passwords even when the LDAP server is unreachable (e.g., when a change on the LDAP server requires adjusting the connection settings), or when no LDAP authentication details exist (like in the case of a CI build server). For this kind of users, just leave the "Disable Internal Password" flag off in the users' details panel.&lt;br /&gt;&lt;div id="palh" style="padding: 1em 0pt; text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_a5tMhAMGeN0/SXuuINqR4AI/AAAAAAAAAAk/7FfLSdKVSmE/s1600-h/Picture+4.png"&gt;&lt;img style="cursor: pointer; width: 352px; height: 125px;" src="http://3.bp.blogspot.com/_a5tMhAMGeN0/SXuuINqR4AI/AAAAAAAAAAk/7FfLSdKVSmE/s400/Picture+4.png" alt="" id="BLOGGER_PHOTO_ID_5295017243033329666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's it!&lt;br /&gt;&lt;br /&gt;Enjoy&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-5100348772530084810?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/5100348772530084810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/01/avoiding-clear-text-passwords-in-maven.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5100348772530084810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/5100348772530084810'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/01/avoiding-clear-text-passwords-in-maven.html' title='Avoiding Clear Text Passwords in Maven'/><author><name>Yoav Landman</name><uri>http://www.blogger.com/profile/04609544830985043196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_a5tMhAMGeN0/S458ju-vC9I/AAAAAAAAAGc/tctBm9XFIjI/S220/yoav.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_a5tMhAMGeN0/SXutUxZ8OOI/AAAAAAAAAAU/tt7coR_emWM/s72-c/Picture+3.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-3225629185950928782</id><published>2009-01-05T22:38:00.003+02:00</published><updated>2009-01-05T23:48:51.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Yoav Landman'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Artifactory 2.0 has been released!</title><content type='html'>&lt;b&gt;We are pleased to announce the availability of Artifactory 2.0.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://artifactory.jfrog.org/"&gt;Artifactory&lt;/a&gt; is an advanced Maven repository manager, offering powerful enterprise features, such as LDAP/Active Directory integration and fine-grained permission control, behind an easy-to-use user interface.&lt;br /&gt;&lt;br /&gt;With this second major release of Artifactory, Artifactory is 100% configurable via an Ajax web UI and is packed with many enterprise-level features out-of the box:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Built-in UI configurable and UI-testable LDAP integration (other integrations possible via Spring Security).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No more clear text passwords in your Maven settings.xml - Artifactory offers auto-generated encrypted passwords, which is extremely important when using external authentication.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ability to undeploy complete versions and remove in one go hundreds of old artifacts deployed from the same module.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sophisticated role-based access control (RBAC), e.g - you can allow only certain groups to see sources.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Security domain level administrators.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Real time view for the effective RBAC on a selected artifact/node.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ability to deploy a bundle of zipped artifacts and import a Maven local repository into Artifactory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;True undeploy with immediate Maven metadata updates.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Real time tailing of server logs from the UI.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Remote checksum validations.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Built-in support for MySql.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tomcat install script has been Improved and the ability to run as a Windows Service.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Special support to run under IBM WebSphere.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;An artadmin command-line tool for performing various administrative tasks.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The underlying architecture to support high volumes of concurrent downloads and uploads have been updated.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Help on nearly every UI element.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improved, complete user guide.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Artifactory is available for immediate download from the &lt;a href="http://www.jfrog.org/download.php"&gt;JFrog Site&lt;/a&gt; or directly from &lt;a href="http://sourceforge.net/project/platformdownload.php?group_id=175347"&gt;SourceForge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The detailed release information is available from JIRA &lt;a href="http://issues.jfrog.org/jira/browse/RTFACT/fixforversion/10290"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Artifactory User Guide can be found &lt;a href="http://wiki.jfrog.org/confluence/display/RTF/Artifactory+User+Guide"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can also try the &lt;a href="http://repo.jfrog.org/"&gt;Online Demo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;The JFrog Artifactory Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-3225629185950928782?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/3225629185950928782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/01/artifactory-20-has-been-released.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/3225629185950928782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/3225629185950928782'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/01/artifactory-20-has-been-released.html' title='Artifactory 2.0 has been released!'/><author><name>JFrog Team</name><uri>http://www.blogger.com/profile/10513985431274855765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_RInA_3Y77C4/SWMIIMNCLnI/AAAAAAAAAAM/etPSoH9LyHs/S220/jfrog-frog.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990156302547833748.post-8648923791692781250</id><published>2008-11-20T15:23:00.000+02:00</published><updated>2009-01-05T19:15:54.591+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fred Simon'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='artifactory'/><title type='text'>Lists and Contextual Menus, MMI nightmare!</title><content type='html'>I'm more of a "server side" kind of developer.&lt;br /&gt;When I see too much HTML, CSS and Javascript, I need pills!&lt;br /&gt;Still, I like to challenge the MVC architecture of UI frameworks. I even wrote my own web framework for fun (but some poor developers, in India I think, are now suffering from it), and played with Swing developing Stellarium4Java.&lt;br /&gt;&lt;br /&gt;So, UI is not my cup of Tea. Now, for the latest release of &lt;a href="http://artifactory.jfrog.org/"&gt;Artifactory&lt;/a&gt;, I needed to managed the communication between the UI Designer and the Web developers. I learned a lot from this interesting experience.&lt;br /&gt;During this process I encountered a really basic UI design issue. It was so basic I got worried I missed something!&lt;br /&gt;The point is: The way we are used to manage lists, selections, actions and contextual menus is totally incoherent.&lt;br /&gt;&lt;br /&gt;In real UI applications (fat client and Ajax), you get a list of elements and then you can act on them. Usually, you select a line, then some Action (Buttons, Menus) become enabled and you can activate them. But to minimize the amount of clicks and mouse gestures there are also contextual menus. This is where it gets weird...&lt;br /&gt;You select one line, and then can actually "right click" on another one. That way, the list of Actions on the contextual menus does not match the one in buttons and menus.&lt;br /&gt;You can force select the line where you right click, but few Applications are doing it!&lt;br /&gt;&lt;br /&gt;The other issue is that contextual menus are really not that great (i.e. I hate them!):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;They are not Web Browser friendly.&lt;/li&gt;&lt;li&gt;They don't actually save much in terms of clicks and gestures (right click, move, left click).&lt;/li&gt;&lt;li&gt;They get in the middle of reading the lists of elements.&lt;/li&gt;&lt;li&gt;They never disappear when you want them to, and always disappear before you find the menu item you want to click on.&lt;/li&gt;&lt;li&gt;To remove them go away you need to click elsewhere, crossing your finger you did not actually click on "buy in one click" button.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;One solution on the Web (and on the iPhone/iPod, where there is no right click :), is to add action buttons directly in the list itself as columns. That works and can be nice looking (with good icons) but this technique get very heavy (bunch of garbage icons all over). Anyway, it is not scalable: 5 icons it's already too much.&lt;br /&gt;&lt;br /&gt;So, the UI designer came with the really cool idea: A hovering toolbox appearing on the side of the list when rollover the line element.&lt;br /&gt;At first, I thought:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It may work but we'd be going against a big UI muscle memory about how to use a list.&lt;/li&gt;&lt;li&gt;People will hate it!&lt;/li&gt;&lt;li&gt;The toolbox is too far from where my mouse is, and going there will be very annoying.&lt;/li&gt;&lt;li&gt;We are not here to reinvent UI and Men Machine Interaction!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;But, anyway I took the chance and we implemented it. To see it, you can go to &lt;a href="http://repo.jfrog.org/artifactory/"&gt;Artifactory live demo&lt;/a&gt;, do a quick search on "log" for example, and hover above the list. It's still a beta version and the previous select/link actions are not removed, so it may be confusing. As anonymous user your action list is limited, but you can still get the feel of it.&lt;br /&gt;&lt;br /&gt;I'm using this feature for 2 weeks now and frankly: I love it!&lt;br /&gt;I hover on the list in the left side of it, I can read the line I'm on, and then activate the action with one click. Just natural moves and ONLY ONE click.&lt;br /&gt;&lt;br /&gt;May be I'm under the influence (it's our application at the end :), and that's why I'm anxiously waiting for the feedback!&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990156302547833748-8648923791692781250?l=blogs.jfrog.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blogs.jfrog.org/feeds/8648923791692781250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blogs.jfrog.org/2009/01/lists-and-contextual-menus-mmi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8648923791692781250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990156302547833748/posts/default/8648923791692781250'/><link rel='alternate' type='text/html' href='http://blogs.jfrog.org/2009/01/lists-and-contextual-menus-mmi.html' title='Lists and Contextual Menus, MMI nightmare!'/><author><name>Frederic Simon</name><uri>http://www.blogger.com/profile/01537253748863675494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.jfrog.org/sites/fred/FredSimon.jpg'/></author><thr:total>0</thr:total></entry></feed>
