{"id":3348,"date":"2022-12-01T11:08:38","date_gmt":"2022-12-01T11:08:38","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"modified":"2026-03-09T13:07:45","modified_gmt":"2026-03-09T13:07:45","slug":"handle-multiple-environments-for-multiple-projects-on-one-machine","status":"publish","type":"post","link":"https:\/\/thecodest.co\/en\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","title":{"rendered":"Handle multiple environments for multiple projects on one machine?"},"content":{"rendered":"\n<p>Let&#8217;s take a look at a typical work environment in a <a href=\"https:\/\/thecodest.co\/en\/dictionary\/how-to-choose-software-house\/\">software house<\/a>. You have a few customers that have different environments. Some prefer MySQL, others prefer Postgres. One version of your application needs <a href=\"https:\/\/thecodest.co\/en\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a> 11, and another Java 17. Frontend needs npm 12 or 16 because you use different versions of <a href=\"https:\/\/thecodest.co\/en\/dictionary\/what-is-node-js-used-for-in-angular\/\">angular<\/a>. Finally, you have that three-dimensional array that contains combinations of all your DBs, backend, and frontend versions. Sounds bad, but one day your boss says\u2026<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/comic.png\" alt=\"comics<em&gt;with<\/em&gt;boss\" title=\"when your boss says...\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Roots of a multiverse environment<\/h2>\n\n\n\n<p>The situation described above isn&#8217;t something uncommon. Migration between language or framework versions, updates of databases or simply different requirements coming from customers could turn upside-down all configurations. We should have a solution that helps <a href=\"https:\/\/thecodest.co\/en\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> manage those changes, one that matches a few assumptions and\/or requirements and\/or goals:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b> easy to use<\/b> \u2013 single command to change a configuration or a version,<\/li>\n\n\n\n<li><b>rich library<\/b> \u2013 should support multiple technologies and \u201cthings\u201d (libraries, frameworks, apps),<\/li>\n\n\n\n<li><b> extensible<\/b> \u2013 you should offer the possibility to add your plugins.<\/li>\n<\/ul>\n\n\n\n<p>In this article, I will focus on three areas. First is tools for Java and JVM. The second is general-purpose tools. The third is how to use <a href=\"https:\/\/thecodest.co\/en\/dictionary\/docker-developer\/\">docker<\/a> to achieve our goals.<\/p>\n\n\n\n<p>\u200b<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">I am Java and I work on JVM<\/h2>\n\n\n\n<p>When you are a <strong><a href=\"https:\/\/thecodest.co\/en\/dictionary\/java-developer\/\">Java developer<\/a><\/strong> or, more generally, you work with <strong>JVM technologies<\/strong>, then you can use <a href=\"https:\/\/sdkman.io\/\">SDKMAN!<\/a>. This is a very nice and easy-to-use tool that supports many libraries, frameworks, and languages.<\/p>\n\n\n\n<p>The installation process of <strong>SDKMAN!<\/strong> Is pretty simple. You need to run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>curl -s \"https:\/\/get.sdkman.io\" | bash<\/code><\/code><\/pre>\n\n\n\n<p>and then<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code><code>source \"$HOME\/.sdkman\/bin\/sdkman-init.sh\"<\/code><\/code><\/code><\/pre>\n\n\n\n<p>Now you can manage your <strong>Java<\/strong>, <strong>Scala<\/strong> and <strong>Maven<\/strong> versions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Managing versions \u2013 example<\/h3>\n\n\n\n<p>In this example, we will install and update the version of a few tools. This is just a small subset of available tools.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation<\/h3>\n\n\n\n<p>Let&#8217;s assume your new <a href=\"https:\/\/thecodest.co\/en\/dictionary\/why-do-projects-fail\/\">project<\/a> uses <strong>Java 17<\/strong>. You don&#8217;t have any <strong>Java<\/strong> version installed. You want to install it and, in addition, add a Maven Daemon tool to make the builds faster. So, you need to install Maven, too. To do that, you need to execute three simple commands:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install java 17-open\n\n$ sdk install maven 3.8.4\n\n$ sdk install mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>At the end of installing each tool, you will be asked about making it default:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>Do you want Java 17-open to be set as default? (Y\/n):<\/code><\/code><\/pre>\n\n\n\n<p>This is important when you install a new version of a library or a language, because of SDKMAN! will set that default version as global for all terminals for the current user.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Checking versions and updating<\/h3>\n\n\n\n<p>From time to time, SDKMAN! needs to update indexes. During this, you could a get message that there are some new versions of tools that you use. We can check which versions are available by typing <code>sdk ls &lt;TOOL&gt;<\/code>. For <code>sdk ls maven<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Available Maven Versions\n\n================================================================================\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.8.6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.8.5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n3.8.4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.8.3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.8.2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.8.1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.6.3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.6.2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.6.1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.6.0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.0.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.5.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.5.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.5.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.5.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n&nbsp;&nbsp;&nbsp;&nbsp;3.3.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\n\u200b\n\n================================================================================\n\nlocal version\n\ncurrently in use\n\n================================================================================<\/code><\/pre>\n\n\n\n<p>As we see above, Maven has a newer version than the one we use. The same is for <code>mvnd<\/code> (0.8.2) and Java (19-open). Let&#8217;s update everything. To do that, we just need to call the install command but in this time, we don&#8217;t use a version specifier:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ sdk install maven\n\n$ sdk install mvnd\n\n$ sdk install java<\/code><\/pre>\n\n\n\n<p>But something wrong happened. <code>Maven<\/code> and <code>mvnd<\/code> have correct versions, but <strong>Java<\/strong> has version <code>17.0.5-tem<\/code>. That\u2019s because \u201cthe newest\u201d version of the tool is controlled by its vendor not local SDKMAN! who is this vendor? A vendor in SDKMAN! is someone who can publish a version. However, let&#8217;s say that we finally install <code>19-open<\/code>, and we made it default, but for some reason, we need to use <code>17-open<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Local versions and per-terminal version management<\/h3>\n\n\n\n<p>\u200b<br>We can configure a <code>default<\/code> version of a tool that is global for all projects and terminals. But when we need a specific version, we have two ways to do that. First is to use the <code>sdk use &lt;TOOL&gt; &lt;VERSION&gt;<\/code> command every time when we want to use a specific version of a tool in the current terminal. Second is to prepare a versions list in a <code>.sdkmanrc<\/code> file that is stored with the project.<\/p>\n\n\n\n<p>While the first option is for single use, the second is designed for working with teams and sharing configurations between <a href=\"https:\/\/thecodest.co\/en\/dictionary\/how-to-lead-software-development-team\/\">team<\/a> members.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pros and cons of SDKMAN!<\/h3>\n\n\n\n<p>SDKMAN! is very easy to use and has a rich library of supported tools, frameworks and languages. It works on Linux, MacOS and Windows. On the other hand, this tool is JVM-focused and requires the author\u2019s acceptance to be a vendor. In addition, the mechanic of <code>.sdkmanrc<\/code> is very poor and could significantly slow down the process of changing directories.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">I would like to use many other languages<\/h2>\n\n\n\n<p>If you need to use many languages and tools, you should take a look at <a href=\"https:\/\/asdf-vm.com\/\">asdf<\/a>. This tool is focused on \u201chigh-level\u201d tools. While in SDKMAN! you can find many Java-specific tools, like Bpipe or Znai, asdf offers much more tools but not so specific. Of course, some of those tools overlap, e.g. Java, Tomcat or mvnd are available in both.<\/p>\n\n\n\n<p>When you would like to use <code>asdf<\/code>, you need to have <code>git<\/code> and <code>curl<\/code> installed. After that, you just:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"><code>git clone https:\/\/github.com\/asdf-vm\/asdf.git ~\/.asdf --branch v0.10.2<\/code><\/code><\/pre>\n\n\n\n<p>and add these lines in <code>~\/.bashrc<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">. $HOME\/.asdf\/asdf.sh\n\n. $HOME\/.asdf\/completions\/asdf.bash<\/code><\/pre>\n\n\n\n<p>Now you can install plugins and tools in your favorite versions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Plugin based management<\/h3>\n\n\n\n<p>Unlike SDKMAN!, <code>asdf<\/code> uses plugins to manage tools. So, before you can install a tool, you need to install a plugin. Let&#8217;s go back to our example project and try to configure the environment using <code>asadfsdf<\/code>.<\/p>\n\n\n\n<p>First, we need to install plugins:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf plugin add java\n\nasdf plugin add maven\n\nasdf plugin add mvnd<\/code><\/pre>\n\n\n\n<p>Then we can install our tools:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">asdf install java openjdk-17\n\nasdf install maven 3.8.4\n\nasdf install mvnd 0.7.1<\/code><\/pre>\n\n\n\n<p>And once again, unlike SDKMAN!, <code>asdf<\/code> doesn&#8217;t change anything in our environment. When we try to use java, we get an error message like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">No version is set for command Java\n\nConsider adding one of the following versions in your config file at ~\/.tool-versions\n\njava openjdk-17<\/code><\/pre>\n\n\n\n<p>We need to create file <code>.tool-versions<\/code> in the home directory to manage default versions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Local and global versions<\/h3>\n\n\n\n<p>Updating software versions with <code>asdf<\/code> is pretty simple. We just install a new version. Because this process does not affect the environment, we could do that at any time and at any place in the file system. When we want to use a specific version of some software, we need to create in the project directory a <code>.tool-versions<\/code> file that could be shared between team members. Remember that you need to guarantee that all team members have <code>asdf<\/code> and plugins installed. The list of plugins you can find <a href=\"https:\/\/github.com\/asdf-vm\/asdf-plugins\">here<\/a>\u200b.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Version conflicts<\/h3>\n\n\n\n<p><code>asdf<\/code> supports not only programming languages, frameworks, and tools like vim or kubernetess. It supports databases, too. In such a case, we could install multiple versions of e.g. Postgres but only one instance could run. That\u2019s because <code>asdf<\/code> executes commands directly on your OS without any separation layer. That leads to problems like \u201cport already in use\u201d and conflicts on resources.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pros and cons<\/h3>\n\n\n\n<p><code>asdf<\/code> is a very good tool if you would like to work in a polyglot environment. It supports many tools, languages, and frameworks. Plugin-based architecture makes it very easy to extend that. However, some of the tools that it has in the library need additional work during installation to provide all required dependencies. <code>asdf<\/code> does not work on Windows, even on <a href=\"https:\/\/en.wikipedia.org\/wiki\/Windows_Subsystem_for_Linux\">WSL<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Last but not least \u2013 Docker<\/h2>\n\n\n\n<p>When I talk about the port conflict above, many of you know the solution.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.docker.com\/\">Docker<\/a> could help us in some cases. I mention it out of duty, because this tool is so big and complex that we cannot discuss it in one article.<\/p>\n\n\n\n<p>Together with Docker, we should use a <a href=\"https:\/\/docs.docker.com\/compose\/\">docker-compose<\/a> tool that gives us the possibility to coordinate multi-container environments.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pros and cons of Docker<\/h3>\n\n\n\n<p>Docker helps us manage tools that need some specific resources, like ports or files. It separates instances in containers and gives us full control over them. Nevertheless, Docker is a tool that introduces a lot of complexity to our working environment and could be problematic in some cases. One of those cases of using Docker in a test is described in one of our previous <a href=\"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\">article<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summing up<\/h2>\n\n\n\n<p>I know that I didn&#8217;t describe all tools that could be used for managing tool versions. There are many more of them, such as <a href=\"https:\/\/www.jenv.be\/\">jEnv<\/a> that could replace SDKMAN,<\/p>\n\n\n\n<p>or <a href=\"https:\/\/github.com\/nvm-sh\/nvm\">NVM<\/a> that we can use to manage npm or <a href=\"https:\/\/rvm.io\/\">RVM<\/a> for <a href=\"https:\/\/thecodest.co\/en\/case-studies\/providing-a-team-of-ruby-developers-for-a-fintech-company\/\">Ruby<\/a>. I focused on tools that I \u201ctested on the battlefield\u201d and can recommend to anyone.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/thecodest.co\/contact\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1283\" height=\"460\" src=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"\" class=\"wp-image-4927\" srcset=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png 1283w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-300x108.png 300w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-1024x367.png 1024w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-768x275.png 768w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-18x6.png 18w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-67x24.png 67w\" sizes=\"auto, (max-width: 1283px) 100vw, 1283px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Is there a golden mean to handle many environments for a great number on just one machine? Our Java Expert Bart\u0142omiej knows the answer!<\/p>\n","protected":false},"author":2,"featured_media":3349,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3348","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Handle multiple environments for multiple projects on one machine? - The Codest<\/title>\n<meta name=\"description\" content=\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/en\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handle multiple environments for multiple projects on one machine?\" \/>\n<meta property=\"og:description\" content=\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/en\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-01T11:08:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-09T13:07:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Handle multiple environments for multiple projects on one machine?\",\"datePublished\":\"2022-12-01T11:08:38+00:00\",\"dateModified\":\"2026-03-09T13:07:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"},\"wordCount\":1315,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\",\"name\":\"Handle multiple environments for multiple projects on one machine? - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"datePublished\":\"2022-12-01T11:08:38+00:00\",\"dateModified\":\"2026-03-09T13:07:45+00:00\",\"description\":\"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/handle-multiple-environments-for-multiple-projects-on-one-machine\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Handle multiple environments for multiple projects on one machine?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/en\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Handle multiple environments for multiple projects on one machine? - The Codest","description":"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thecodest.co\/en\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","og_locale":"en_US","og_type":"article","og_title":"Handle multiple environments for multiple projects on one machine?","og_description":"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.","og_url":"https:\/\/thecodest.co\/en\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","og_site_name":"The Codest","article_published_time":"2022-12-01T11:08:38+00:00","article_modified_time":"2026-03-09T13:07:45+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Handle multiple environments for multiple projects on one machine?","datePublished":"2022-12-01T11:08:38+00:00","dateModified":"2026-03-09T13:07:45+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"},"wordCount":1315,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","articleSection":["Software Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","url":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/","name":"Handle multiple environments for multiple projects on one machine? - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","datePublished":"2022-12-01T11:08:38+00:00","dateModified":"2026-03-09T13:07:45+00:00","description":"Discover how developers can handle multiple environments for different projects on a single machine using version managers and containerization.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/how_to_handle_multiple_environments_for_numerous_projects_on_just_one_machine_.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/handle-multiple-environments-for-multiple-projects-on-one-machine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Handle multiple environments for multiple projects on one machine?"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/en\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/posts\/3348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/comments?post=3348"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/posts\/3348\/revisions"}],"predecessor-version":[{"id":8550,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/posts\/3348\/revisions\/8550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/media\/3349"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/media?parent=3348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/categories?post=3348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/en\/wp-json\/wp\/v2\/tags?post=3348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}