<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jishnu Viswanath on Medium]]></title>
        <description><![CDATA[Stories by Jishnu Viswanath on Medium]]></description>
        <link>https://medium.com/@neolivz?source=rss-578dab0f5b6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Stories by Jishnu Viswanath on Medium</title>
            <link>https://medium.com/@neolivz?source=rss-578dab0f5b6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 16 May 2026 17:26:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@neolivz/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[How to publish to JFrog artifactory from Kotlin Multiplatform Library]]></title>
            <link>https://medium.com/@neolivz/how-to-publish-to-jfrog-artifactory-from-kotlin-multiplatform-library-3b7b695317f4?source=rss-578dab0f5b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/3b7b695317f4</guid>
            <category><![CDATA[kotlin-multiplatform]]></category>
            <category><![CDATA[jfrog]]></category>
            <category><![CDATA[jfrog-artifactory]]></category>
            <category><![CDATA[kotlin]]></category>
            <dc:creator><![CDATA[Jishnu Viswanath]]></dc:creator>
            <pubDate>Wed, 16 Oct 2024 12:13:05 GMT</pubDate>
            <atom:updated>2024-10-16T12:13:05.528Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>I read the article written by <a href="https://medium.com/u/5585fcfd2067">Haris Stasinos</a> on <a href="https://medium.com/@XarhsSta/how-to-publish-a-kotlin-multiplatform-library-to-jfrog-3424dcf8bbf7">How to publish a Kotlin Multiplatform library to JFrog</a>. If you haven’t read it yet please have a read. The issue that I faced was that the article written was to the point with no example code and as primarily a JS/TS developer it took me a lot of searching to figure out how it can be done. This is one more elaborative one and developed from the template of Multiplatform Library from <a href="https://kmp.jetbrains.com/#templateGallery">Kotlin Multiplatform Wizard Template Gallery</a></blockquote><h3>Project Structure</h3><p>At the root level, the project contains libarary folder where all the library code lives and aconventio-plugins folder with two plugin files, one for the root folder and one for the module folder.</p><pre>❯ git ls-tree -r --name-only HEAD | grep -E &quot;\.toml|\.properties|\.kts$&quot; | tree --fromfile<br>.<br>├── build.gradle.kts<br>├── convention-plugins<br>│   ├── build.gradle.kts<br>│   ├── settings.gradle.kts<br>│   └── src<br>│       └── main<br>│           └── kotlin<br>│               ├── module.publication.gradle.kts<br>│               └── root.publication.gradle.kts<br>├── gradle<br>│   ├── libs.versions.toml<br>│   └── wrapper<br>│       └── gradle-wrapper.properties<br>├── gradle.properties<br>├── library<br>│   └── build.gradle.kts<br>└── settings.gradle.kts</pre><h3>Getting Rid Of Nexus Publishing</h3><p>In convention-plugins/build.gradle.kts we make the dependencies empty as well root.publication.gradle.kts we empty the plugins remove the nexusPublishing task. This also means that we have unused entries in gradle/libs.versions.toml and we remove the corresponding entries from the versions and libraries section.</p><h3>Adding JFrog Artifactory</h3><p>In gradle/libs.versions.toml we add jfrog-artifactory</p><pre>[versions]<br>jfrog = &quot;5.+&quot;<br># Other versions<br><br>[libraries]<br>jfrog-artifactory = { module = &quot;com.jfrog.artifactory:com.jfrog.artifactory.gradle.plugin&quot;, version.ref = &quot;jfrog&quot; }<br># Other libaries<br><br>[plugins]<br># Other plugins</pre><p>Once we add that we need to add the jfrog-artifactoryas a dependency for the convention-plugins/build.gradle.kts</p><pre>dependencies {<br>    implementation(libs.jfrog.artifactory)<br>}</pre><p>We can now add the plugin in module.publication.gradle.kts</p><pre>plugins {<br>    `maven-publish`<br>    signing<br>    id(&quot;com.jfrog.artifactory&quot;)<br>}</pre><p>This now allows us to add artifactory task in the same file module.publication.gradle.kts</p><pre>artifactory {<br>    setContextUrl(project.findProperty(&quot;artifactory_contextUrl&quot;) as String)<br>    publish {<br>        repository {<br>            setRepoKey(project.findProperty(&quot;artifactory_snapshot_repo&quot;) as String)<br>            setUsername(project.findProperty(&quot;artifactory_user&quot;) as String)<br>            setPassword(project.findProperty(&quot;artifactory_password&quot;) as String)<br>        }<br>        defaults {<br>            publications(&quot;kotlinMultiplatform&quot;, &quot;androidRelease&quot;, &quot;jvm&quot;)<br>            setPublishArtifacts(true)<br>        }<br>    }<br>}</pre><p>NOTE: I have set all the property values in ~/.gradle/gradle.properties</p><pre>artifactory_user=dummyUser<br>artifactory_password=dummyPassword<br>artifactory_contextUrl=https://dummUrl/dummyPath<br>artifactory_snapshot_repo=dummy-snapshot-repo-key</pre><p>One last thing in gradle.properties we need to disable configuration-cache</p><pre>org.gradle.configuration-cache=false</pre><h3>Conclusion</h3><p>The full source code can be accessed from the <a href="https://github.com/neolivz/multiplatform-library-template/tree/jfrog-artifactory">jfrog-artifactory</a> branch in my fork and the <a href="https://github.com/neolivz/multiplatform-library-template/pull/1/files">diff</a> can be accessed from the merged pull request. Thank you for reading.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3b7b695317f4" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>