{"id":533,"date":"2017-10-20T14:07:09","date_gmt":"2017-10-20T12:07:09","guid":{"rendered":"http:\/\/itblog.inginea.eu\/?p=533"},"modified":"2021-05-13T16:33:10","modified_gmt":"2021-05-13T14:33:10","slug":"using-hotswapagent-to-speed-up-development","status":"publish","type":"post","link":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/","title":{"rendered":"Using HotswapAgent to speed up development"},"content":{"rendered":"<p>As a Java EE developer, I sometimes envy how fast it&#8217;s possible to see the result of a code change in a running application with interpreted languages like PHP or JavaScript. With Java, it&#8217;s always necessary to rebuild the source code in a bytecode, which can be then safely updated only by restarting the whole application. And all developers know that restoring the desired state of the application after a fresh restart takes time and is tedious. A while ago I&#8217;ve come across an opensource tool called <a href=\"http:\/\/hotswapagent.org\/\">HotswapAgent<\/a> that speeds up code reloading.<!--more--><\/p>\n<p>Many developers know that <a href=\"https:\/\/zeroturnaround.com\/software\/jrebel\/\">JRebel<\/a> can help a lot with updating the code on the fly. There&#8217;s been a lot of effort put into it to support all sorts of code and resource changes and refresh them with virtually any Java framework used by the application. But the downside is that it&#8217;s pretty expensive for a casual developer, doing just some hacking on his\/her own or working on a non-commercial project. I have some experience with JRebel and I liked it a lot, but I was using it on a commercial project where I didn&#8217;t pay for the license. I tried HotswapAgent and it has worked very well as a free alternative of JRebel for me for my personal Java EE projects. I&#8217;m going to write up how I got it running in my IDE and my Java EE server of choice &#8211; <a href=\"https:\/\/www.payara.fish\">Payara Server<\/a>.<\/p>\n<h2>Getting started with HotswapAgent<\/h2>\n<p>Hotswap\u00a0Agent itself is just a java agent, which has to be attached to the application. It essentially scans the classpath to detect the presence of known frameworks and tries to refresh the frameworks after a code or resource change is detected. It&#8217;s also possible to write custom plugins for any project or even specifically for your application. However, getting the most of Hotswap\u00a0Agent requires installing an alternative DCEVM engine into your JRE installation, which does much better job in reloading code changes than the standard VM engine in the HotSpot VM. The alternative VM engine is basically a patched version of the standard engine, which improves code hot swap via the debugging interface, without impacting other functions of the JVM.<\/p>\n<p>So to summarize, we are going to do this to work with HotSwap from our IDE of choice:<\/p>\n<ol>\n<li>Install the <a href=\"https:\/\/github.com\/dcevm\/dcevm\/releases\">DCEVM<\/a> engine into a Java installation (JRE or JDK)<\/li>\n<li>Configure the IDE to start the application with the <a href=\"https:\/\/github.com\/HotswapProjects\/HotswapAgent\/releases\">HotswapAgent JAR<\/a> as java agent and using the DCEVM engine instead of the standard JVM engine<\/li>\n<li>Configure the IDE to refresh plain text resources like XML, property files, in the running application (this has to be done by the IDE because it&#8217;s not supported by Java debugger)<\/li>\n<li>Start the application in debug mode and connect to it via the debugger interface from withing IDE<\/li>\n<li>Continue coding and see the changes in your app immediately \ud83d\ude09<\/li>\n<\/ol>\n<h2>Installing\u00a0the DCEVM engine<\/h2>\n<p>First, download the <a href=\"https:\/\/github.com\/dcevm\/dcevm\/releases\">DCEVM installer<\/a> for your Java installation.\u00a0The project is pretty quick to release new versions\u00a0for new Java updates. At the time of writing this blog post, there was a build for Java 8 update 144 available, released 12 days ago, just a month after the actual Java 8 update 144 had been released. There aren&#8217;t releases of DCEVM for every Java update, but I always just used the latest version with my Java installation and never had any issues.<\/p>\n<p>The installer is a plain executable JAR file, which you can start with <span class=\"lang:java decode:true crayon-inline\">java -jar DCEVM-installer.jar<\/span>\u00a0. In Linux, I usually start this with admin privileges (using sudo), because it will add\/modify files in the Java installation, which is usually read-only for standard users if installed system-wide:\u00a0\u00a0<span class=\"lang:java decode:true crayon-inline\">sudo java -jar\u00a0DCEVM-installer.jar<\/span><\/p>\n<p>The installer will open a window, which lists all the detected Java installations on the system.<\/p>\n<div id=\"attachment_536\" style=\"width: 940px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?ssl=1\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-536\" data-attachment-id=\"536\" data-permalink=\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/screenshot-from-dcevm\/\" data-orig-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?fit=930%2C650&amp;ssl=1\" data-orig-size=\"930,650\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Screenshot from DCEVM\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?fit=300%2C210&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?fit=640%2C447&amp;ssl=1\" class=\"wp-image-536 size-full\" src=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?resize=640%2C447&#038;ssl=1\" alt=\"Screenshot from DCEVM\" width=\"640\" height=\"447\" srcset=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?w=930&amp;ssl=1 930w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?resize=300%2C210&amp;ssl=1 300w, https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/09\/Screenshot-from-DCEVM.png?resize=700%2C489&amp;ssl=1 700w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><p id=\"caption-attachment-536\" class=\"wp-caption-text\">The DCEVM installer windows showing all detected Java installations<\/p><\/div>\n<p>set configs.config.server-config.java-config.java-home=&#8221;$DCEVM_JAVA_HOME&#8221;<\/p>\n<p>It&#8217;s possible to install the DCEVM engine in 2 ways:<\/p>\n<ul>\n<li>replace the current VM engine with DCEVM<\/li>\n<li>as an alternative engine into a Java installation, which won&#8217;t affect\u00a0the standard bahavior of the JVM<\/li>\n<\/ul>\n<p>If you install DCEVM as an alternative engine, you can enable it by passing <span class=\"lang:java decode:true crayon-inline\">-XXaltjvm=dcevm<\/span>\u00a0 command line option to the <span class=\"lang:java decode:true crayon-inline \">java<\/span>\u00a0 command along with the other options, like:<\/p>\n<pre class=\"toolbar:2 nums:false nums-toggle:false lang:sh decode:true\">java -XXaltjvm=dcevm -Xmx500m -jar application.jar<\/pre>\n<p>I was usually successful with\u00a0installing DCEVM as an alternative engine, which is less intrusive and very transparent. The DCEVM engine can then be enabled by a command line option only if you want it and you can have the same Java installation for both running third-party Java programs and development. The\u00a0second option of replacing the current VM engine with DCVEM is convenient if you can&#8217;t pass additional command line arguments to the java program. In that case, I recommend using a separate Java installation to replace the default engine by DCEVM and use to it only during development.<\/p>\n<p>The\u00a0second option of replacing the current VM engine with DCVEM is convenient if you can&#8217;t pass additional command line arguments to the java program. In that case, I recommend using a separate Java installation to replace the default engine by DCEVM and use to it only during development.<\/p>\n<h2>Configure the IDE to use HotswapAgent<\/h2>\n<p>In order to enable the HotswapAgent, it has to be passed to the java program as an agent, via the <span class=\"lang:java decode:true crayon-inline\">-javaagent<\/span> command line parameter. Then you have to pass additional parameters to enable the debug mode. Before configuring the IDE, I&#8217;ll explain\u00a0how to start an application from command line, which is essentially what you need to configure in any IDE.<\/p>\n<p>First, download the <a href=\"https:\/\/github.com\/HotswapProjects\/HotswapAgent\/releases\">HotswapAgent JAR<\/a>\u00a0to some shared location. The JAR file will remain there and will be referenced by the\u00a0\u00a0<span class=\"lang:java decode:true crayon-inline\">-javaagent<\/span>\u00a0command line parameter. Additionally, we&#8217;ll enable remote debugging on port 9009, with suspend=n so that the application\u00a0doesn&#8217;t wait for the debugger to be attached. We can then attach a debugger at any time we want to update the application with code changes. This is an example of the command line to start an application with the HotswapAgent JAR located in <span class=\"lang:java decode:true crayon-inline \">\/development\/hotswap-agent.jar<\/span>\u00a0:<\/p>\n<pre class=\"toolbar:2 nums:false nums-toggle:false lang:sh decode:true\">java -XXaltjvm=dcevm -javaagent:\/development\/hotswap-agent.jar \\\n  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009 \\\n  -jar application.jar<\/pre>\n<p>If you haven&#8217;t installed DCEVM as an alternative JVM but replaced the default JVM engine, you should omit the\u00a0<span class=\"lang:java decode:true crayon-inline\">-XXaltjvm=dcevm<\/span>\u00a0argument.<\/p>\n<p>To configure HotswapAgent in your IDE, you have to do the following steps:<\/p>\n<ol>\n<li>Make sure that the IDE can apply your code changes via the debugger. In most IDEs this means that\n<ul>\n<li>automatic compile on saving is turned on<\/li>\n<li>compiled classes are automatically replaced in the running application\u00a0if it&#8217;s attached to the IDE via the debug interface<\/li>\n<\/ul>\n<\/li>\n<li>Make sure that the IDE uses the Java installation with the DCEVM engine\n<ol>\n<li>if DCEVM was installed as an alternative engine, the IDE has to pass\u00a0the\u00a0<span class=\"lang:java decode:true crayon-inline\">-XXaltjvm=dcevm<\/span>\u00a0argument when starting the application in debug mode<\/li>\n<\/ol>\n<\/li>\n<li>Turn off any restart\/redeployment of the application on code change (this applies mostly when using application servers via an IDE server plugin)<\/li>\n<\/ol>\n<p>Detailed instructions how to do it in major Java IDEs can be found on the <a href=\"https:\/\/github.com\/HotswapProjects\/HotswapAgent\/wiki#setup-in-ide\">HotswapAgent Wiki<\/a>.<\/p>\n<h2>Using HotswapAgent with Payara Server<\/h2>\n<p>Some frameworks or application servers require additional configuration. This is mostly because the hotswap-agent.jar has to be added to the classpath and the agent isn&#8217;t able to modify the classloader to add the required classes automatically, or the framework or server spawns additional JVM process and has to be configured to use a JVM with DCEVM.<\/p>\n<p>To use HotswapAgent with DCEVM while developing applications with Payara Server, it requires\u00a0doing the following changes:<\/p>\n<ol>\n<li>copy the <span class=\"lang:java decode:true crayon-inline\">hotswap-agent.jar<\/span>\u00a0 into the <span class=\"lang:java decode:true crayon-inline\">lib\/ext<\/span>\u00a0folder in the\u00a0Payara Server&#8217;s domain directory. If you&#8217;re using the default <span class=\"lang:java decode:true crayon-inline \">domain1<\/span>\u00a0domain, it would be <span class=\"lang:java decode:true crayon-inline\">glassfish\/domains\/domain1\/lib\/ext\/hotswap-agent.jar<\/span>\u00a0(this is required to add HotswapAgent JAR to the server&#8217;s classpath, at least until HotswapAgent can do it automatically in Payara Server)<\/li>\n<li>point Payara Server to the Java installation with the DCEVM engine, if it&#8217;s not the default\u00a0system installation\n<ul>\n<li>set the Java Home property in JVM general settings to point to the root of your alternative Java installation (with asadmin command you would do this by calling\u00a0<span class=\"lang:sh decode:true crayon-inline\">asadmin set configs.config.server-config.java-config.java-home=&#8221;$ALTERNATIVE_JAVA_HOME&#8221;<\/span>\u00a0)<\/li>\n<\/ul>\n<\/li>\n<li>modify the JVM options:\n<ul>\n<li>remove any <span class=\"lang:java decode:true crayon-inline \">-client<\/span>\u00a0 or <span class=\"lang:java decode:true crayon-inline\">-server<\/span>\u00a0 JVM options (they would prevent using DCEVM as an alternative engine even if the <span class=\"lang:java decode:true crayon-inline\">-XXaltjvm<\/span>\u00a0 option is present)<\/li>\n<li>add\u00a0the <span class=\"lang:java decode:true crayon-inline \">-XXaltjvm<\/span>\u00a0 option<\/li>\n<li>add\u00a0the\u00a0<span class=\"lang:java decode:true crayon-inline\">-javaagent<\/span>\u00a0option with the path to the hotswap-agent.jar, e.g.<span class=\"toolbar:2 nums:false nums-toggle:false lang:sh decode:true crayon-inline\">-javaagent:\/development\/hotswap-agent.jar<\/span>. It can reference the same JAR file which is in the \u00a0<span class=\"lang:java decode:true crayon-inline\">lib\/ext<\/span>\u00a0 folder, even using a relative reference to the domain folder, like this: <span class=\"lang:java decode:true crayon-inline\">-javaagent:${com.sun.aas.instanceRoot}\/lib\/ext\/hotswap-agent.jar<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>If starting Payara Server from IDE, you may have to apply the step 2. and 3. in the configuration of your IDE, because\u00a0the Payara Server plugin in most IDEs bypasses the standard Payara Server configuration and starts Payara Server with the Java runtime and command line parameters specified in the IDE. Mind that in that case, you have to use the full path to the <span class=\"lang:java decode:true crayon-inline \">hotswap-agent.jar<\/span>\u00a0 and avoid using the <span class=\"lang:java decode:true crayon-inline\">${com.sun.aas.instanceRoot}<\/span>\u00a0 variable.<\/p>\n<p>In the IDE, you should also disable automatic redeployment of the application on code change. Most IDE plugins do that by default because under normal circumstances, it&#8217;s the only reliable way to change\u00a0update the application to reflect code changes. Since with HotSwapAgent and DCEVM the usual class reloading is enough, automatic redeploy isn&#8217;t necessary and should be disabled.<\/p>\n<h2>Using HotswapAgent with Payara\u00a0Micro<\/h2>\n<p>Payara Micro is an application runtime that, unlike application servers, is packaged as a single executable JAR file and can be started as such. It deploys applications passed as command line parameters, within the same JVM process. Therefore it&#8217;s very easy to start it with the HotswapAgent in the same way as any other executable JAR:<\/p>\n<pre class=\"toolbar:2 nums:false nums-toggle:false lang:sh decode:true\">java -XXaltjvm=dcevm -javaagent:\/development\/hotswap-agent.jar \\\n  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009 \\\n  -jar payara-micro.jar --deploy application-war<\/pre>\n<p>After it&#8217;s started like this,\u00a0it listens on port 9009 for debugger requests and any IDE can attach its debugger to it.<\/p>\n<p>The web application is deployed from an exploded directory called <span class=\"lang:java decode:true crayon-inline \">application-war<\/span>\u00a0 (not to be confused with a war file package) so that changes in resources like XML or JSF pages are also picked up automatically. Most IDEs support building a web application as an exploded directory. Maven also stages the application in a directory in the <span class=\"lang:java decode:true crayon-inline \">target<\/span>\u00a0 folder before creating the WAR\u00a0file and you can\u00a0deploy your application from that directory using Payara Micro.<\/p>\n<h2>Summary: Using HotswapAgent in Netbeans with Payara Server<\/h2>\n<p>I&#8217;ll\u00a0quickly summarize the steps required to get HotswapAgent running with Payara Server from the Netbeans IDE.<\/p>\n<h3>Install DCEVM<\/h3>\n<ul>\n<li>Use the\u00a0<a href=\"https:\/\/github.com\/dcevm\/dcevm\/releases\">DCEVM installer<\/a>\u00a0to install DCEVM as an alternative VM into a Java installation (you may need to run the installer as administrator)<\/li>\n<\/ul>\n<h3>Configure Payara Server<\/h3>\n<ul>\n<li>Download the\u00a0<a href=\"https:\/\/github.com\/HotswapProjects\/HotswapAgent\/releases\">HotswapAgent JAR<\/a>\u00a0into the\u00a0<span class=\"lang:java decode:true crayon-inline\">lib\/ext<\/span>\u00a0folder in the\u00a0Payara Server&#8217;s domain directory as\u00a0<span class=\"lang:java decode:true crayon-inline\">lib\/ext\/hotswap-agent.jar<\/span><\/li>\n<li>modify the JVM options:\n<ul>\n<li>remove any\u00a0<span class=\"lang:java decode:true crayon-inline\">-client<\/span>\u00a0 or\u00a0<span class=\"lang:java decode:true crayon-inline\">-server<\/span>\u00a0 JVM options<\/li>\n<li>add\u00a0the\u00a0<span class=\"lang:java decode:true crayon-inline\">-XXaltjvm<\/span>\u00a0 option<\/li>\n<li>add\u00a0the\u00a0<span class=\"lang:java decode:true crayon-inline\">-javaagent:${com.sun.aas.instanceRoot}\/lib\/ext\/hotswap-agent.jar<\/span>\u00a0option<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Configure Netbeans<\/h3>\n<ul>\n<li>In Netbeans, open the configuration of the Payara Server service\n<ul>\n<li>ensure that the Java installation with the DCEVM is selected as the Java Platform<\/li>\n<li>there&#8217;s no way to configure JVM options &#8211; the plugin reads the standard Payara Server configuration\u00a0which we modified earlier<\/li>\n<\/ul>\n<\/li>\n<li>Open the project properties\n<ul>\n<li>in <strong>Build -&gt; Compile<\/strong>, ensure that the <strong>Compile On Save<\/strong> option is enabled<\/li>\n<li>in <strong>Run<\/strong>,\u00a0ensure that the <strong>Deploy on Save<\/strong> option is disabled<\/li>\n<\/ul>\n<\/li>\n<li>In Netbeans Options (<strong>Tools -&gt; Options<\/strong>), in <strong>Java -&gt; Java Debugger<\/strong>, ensure that <strong>Apply code changes after save<\/strong> is enabled\n<ul>\n<li>you can also force applying code changes manually with the\u00a0<strong>Apply Code Changes<\/strong> button in the debug toolbar while debugging<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Now, you can\u00a0debug the application in a standard way from within Netbeans. The IDE will automatically compile all classes, update them in the server. It will also copy all changed resources into an exploded directory which it used to deploy the application so that these resources are refreshed too, because Payara Server monitors them for changes.<\/p>\n<h2>Summary: Using HotswapAgent in Netbeans with Payara\u00a0Micro<\/h2>\n<p>The following steps will get you to get HotswapAgent running with Payara Micro and the Netbeans IDE:<\/p>\n<ul>\n<li>install the\u00a0<a href=\"https:\/\/github.com\/dcevm\/dcevm\/releases\">DCEVM<\/a>\u00a0as an alternative VM (the same step as for Payara Server)<\/li>\n<li>In Netbeans, open the project properties\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>in\u00a0<strong>Build -&gt; Compile<\/strong>, ensure that the\u00a0<strong>Compile On Save<\/strong>\u00a0option is enabled<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>In Netbeans Options (<strong>Tools -&gt; Options<\/strong>), in\u00a0<strong>Java -&gt; Java Debugger<\/strong>, ensure that\u00a0<strong>Apply code changes after save<\/strong>\u00a0is\u00a0enabled\n<ul>\n<li>you can also force applying code changes manually with the\u00a0<strong>Apply Code Changes<\/strong>\u00a0button in the debug toolbar while debugging<\/li>\n<\/ul>\n<\/li>\n<li>Find out where Netbeans outputs the\u00a0exploded directory of your application (before it packages it as a WAR file)\n<ul>\n<li>for maven projects, it&#8217;s in the\u00a0<span class=\"lang:java decode:true crayon-inline\">target<\/span>\u00a0 folder and has the same name as the final WAR file, without the WAR extension<\/li>\n<\/ul>\n<\/li>\n<li>Download the\u00a0<a href=\"https:\/\/github.com\/HotswapProjects\/HotswapAgent\/releases\">HotswapAgent JAR<\/a>\u00a0into the same folder that contains your exploded application<\/li>\n<li>Run the application from the exploded directory, with the following command line (assuming that the exploded application directory is called <span class=\"lang:java decode:true crayon-inline \">application-war<\/span>\u00a0 and that payara-micro.jar is in the same folder):\n<ul>\n<li>\n<pre class=\"toolbar:2 nums:false nums-toggle:false lang:sh decode:true\">java -XXaltjvm=dcevm -javaagent:hotswap-agent.jar \\\n  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009 \\\n  -jar payara-micro.jar --deploy application-war<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Attach Netbeans debugger to the application &#8211; menu Debug -&gt; Attach Debugger, use the port 9009 as the debug port<\/li>\n<\/ul>\n<blockquote><p>Republished at:<\/p>\n<ul>\n<li><a href=\"https:\/\/dzone.com\/articles\/using-hotswapagent-to-speed-up-development\">DZone.com<\/a><\/li>\n<\/ul>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>As a Java EE developer, I sometimes envy how fast it&#8217;s possible to see the result of a code change in a running application with interpreted languages like PHP or JavaScript. With Java, it&#8217;s always necessary to rebuild the source code in a bytecode, which can be then safely updated only by restarting the whole [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":553,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[18,64,111,87,66],"tags":[167,165,15,14,104],"series":[],"class_list":["post-533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-config","category-java","category-payara","category-tools","category-web-development","tag-development","tag-hotswap","tag-java","tag-jvm","tag-payara"],"jetpack_publicize_connections":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using HotswapAgent to speed up development - .Lost in Coding<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using HotswapAgent to speed up development - .Lost in Coding\" \/>\n<meta property=\"og:description\" content=\"As a Java EE developer, I sometimes envy how fast it&#8217;s possible to see the result of a code change in a running application with interpreted languages like PHP or JavaScript. With Java, it&#8217;s always necessary to rebuild the source code in a bytecode, which can be then safely updated only by restarting the whole [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\" \/>\n<meta property=\"og:site_name\" content=\".Lost in Coding\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ondrej.mihalyi\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/ondrej.mihalyi\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-20T12:07:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-13T14:33:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/10\/hotswapagent-logo.png?fit=140%2C46&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"140\" \/>\n\t<meta property=\"og:image:height\" content=\"46\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ondro Mih\u00e1lyi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/OndroMih\" \/>\n<meta name=\"twitter:site\" content=\"@OndroMih\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ondro Mih\u00e1lyi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\"},\"author\":{\"name\":\"Ondro Mih\u00e1lyi\",\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"headline\":\"Using HotswapAgent to speed up development\",\"datePublished\":\"2017-10-20T12:07:09+00:00\",\"dateModified\":\"2021-05-13T14:33:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\"},\"wordCount\":2259,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"keywords\":[\"development\",\"hotswap\",\"Java\",\"JVM\",\"Payara\"],\"articleSection\":[\"Configuration\",\"Java\",\"Payara\",\"Tools\",\"Web development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\",\"url\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\",\"name\":\"Using HotswapAgent to speed up development - .Lost in Coding\",\"isPartOf\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#website\"},\"datePublished\":\"2017-10-20T12:07:09+00:00\",\"dateModified\":\"2021-05-13T14:33:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ondro.inginea.eu\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using HotswapAgent to speed up development\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ondro.inginea.eu\/#website\",\"url\":\"https:\/\/ondro.inginea.eu\/\",\"name\":\".Lost in Coding\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ondro.inginea.eu\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616\",\"name\":\"Ondro Mih\u00e1lyi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1\",\"contentUrl\":\"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1\",\"width\":300,\"height\":300,\"caption\":\"Ondro Mih\u00e1lyi\"},\"logo\":{\"@id\":\"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/\"},\"description\":\"Ondro is a software developer and consultant specializing in combining standard and proven tools to solve new and challenging problems. He's been developing in Java for over 10 years. He\u2019s worked for clients like Payara, LottoLand, Uniqa and others. He has co-founded OmniFish, where he works as a director and Jakarta EE expert. He\u2019s passionate about helping his clients and the wider Java community with their projects based on Jakarta EE and similar technologies. As an experienced Java developer and instructor, he's helped companies build and educate their development teams and improve their development processes. He's a core member of several opensource projects and Jakarta EE specification projects. He\u2019s a frequent conference speaker, leader of the Czech JUG and a Java Champion. Ondro is a regular conference speaker at international conferences. Since 2016, he's presented at the following conferences: \u2022 FOSDEM, Brussels, Belgium 2023) \u2022 JChampionsConf, Online (year 2023) \u2022 EclipseCon, Germany (year 2022) \u2022 GeeCon, Prague, Czechia (years 2016, 2019, 2022) \u2022 JavaLand, Bruehl, Germany (years 2018, 2021) \u2022 JFokus, Stockholm, Sweden (year 2019) \u2022 Devops Con, Munich, Germany (year 2019) \u2022 Oracle CodeOne, San Francisco, USA (years 2018, 2019) \u2022 Devoxx, Antwerp, Belgium (year 2018) \u2022 JPrime, Sofia, Bulgaria (years 2017, 2018) \u2022 Java2Days, Sofia, Bulgaria (years 2016, 2018) \u2022 EclipseCon, France (year 2018) \u2022 JavaOne, San Francisco, USA (years 2016, 2017) \u2022 Oracle Code, Prague, Czechia (year 2017) \u2022 Devoxx, London, UK (year 2017) \u2022 GeeCon, Krakow, Poland (year 2017) \u2022 W-JAX, Munich, Germany (years 2016, 2017) \u2022 Bed-Con, Berlin, Germany (year 2017) \u2022 Oredev, Malmo, Sweden (year 2017) \u2022 Devoxx, Casablanca, Morocco (year 2017) \u2022 Java Developer Days, Krakow, Poland (year 2016)\",\"sameAs\":[\"https:\/\/www.facebook.com\/ondrej.mihalyi\",\"https:\/\/cz.linkedin.com\/in\/mihalyiondrej\",\"https:\/\/twitter.com\/https:\/\/twitter.com\/OndroMih\"],\"url\":\"https:\/\/ondro.inginea.eu\/index.php\/author\/ondrejm\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using HotswapAgent to speed up development - .Lost in Coding","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:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/","og_locale":"en_US","og_type":"article","og_title":"Using HotswapAgent to speed up development - .Lost in Coding","og_description":"As a Java EE developer, I sometimes envy how fast it&#8217;s possible to see the result of a code change in a running application with interpreted languages like PHP or JavaScript. With Java, it&#8217;s always necessary to rebuild the source code in a bytecode, which can be then safely updated only by restarting the whole [&hellip;]","og_url":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/","og_site_name":".Lost in Coding","article_publisher":"https:\/\/www.facebook.com\/ondrej.mihalyi","article_author":"https:\/\/www.facebook.com\/ondrej.mihalyi","article_published_time":"2017-10-20T12:07:09+00:00","article_modified_time":"2021-05-13T14:33:10+00:00","og_image":[{"width":140,"height":46,"url":"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/10\/hotswapagent-logo.png?fit=140%2C46&ssl=1","type":"image\/png"}],"author":"Ondro Mih\u00e1lyi","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/OndroMih","twitter_site":"@OndroMih","twitter_misc":{"Written by":"Ondro Mih\u00e1lyi","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#article","isPartOf":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/"},"author":{"name":"Ondro Mih\u00e1lyi","@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"headline":"Using HotswapAgent to speed up development","datePublished":"2017-10-20T12:07:09+00:00","dateModified":"2021-05-13T14:33:10+00:00","mainEntityOfPage":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/"},"wordCount":2259,"commentCount":0,"publisher":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"keywords":["development","hotswap","Java","JVM","Payara"],"articleSection":["Configuration","Java","Payara","Tools","Web development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/","url":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/","name":"Using HotswapAgent to speed up development - .Lost in Coding","isPartOf":{"@id":"https:\/\/ondro.inginea.eu\/#website"},"datePublished":"2017-10-20T12:07:09+00:00","dateModified":"2021-05-13T14:33:10+00:00","breadcrumb":{"@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ondro.inginea.eu\/index.php\/using-hotswapagent-to-speed-up-development\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ondro.inginea.eu\/"},{"@type":"ListItem","position":2,"name":"Using HotswapAgent to speed up development"}]},{"@type":"WebSite","@id":"https:\/\/ondro.inginea.eu\/#website","url":"https:\/\/ondro.inginea.eu\/","name":".Lost in Coding","description":"","publisher":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ondro.inginea.eu\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/07ac1158ec74720744f7146572215616","name":"Ondro Mih\u00e1lyi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/","url":"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1","contentUrl":"https:\/\/i2.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/08\/fotoOMsquare3x300.jpg?fit=300%2C300&ssl=1","width":300,"height":300,"caption":"Ondro Mih\u00e1lyi"},"logo":{"@id":"https:\/\/ondro.inginea.eu\/#\/schema\/person\/image\/"},"description":"Ondro is a software developer and consultant specializing in combining standard and proven tools to solve new and challenging problems. He's been developing in Java for over 10 years. He\u2019s worked for clients like Payara, LottoLand, Uniqa and others. He has co-founded OmniFish, where he works as a director and Jakarta EE expert. He\u2019s passionate about helping his clients and the wider Java community with their projects based on Jakarta EE and similar technologies. As an experienced Java developer and instructor, he's helped companies build and educate their development teams and improve their development processes. He's a core member of several opensource projects and Jakarta EE specification projects. He\u2019s a frequent conference speaker, leader of the Czech JUG and a Java Champion. Ondro is a regular conference speaker at international conferences. Since 2016, he's presented at the following conferences: \u2022 FOSDEM, Brussels, Belgium 2023) \u2022 JChampionsConf, Online (year 2023) \u2022 EclipseCon, Germany (year 2022) \u2022 GeeCon, Prague, Czechia (years 2016, 2019, 2022) \u2022 JavaLand, Bruehl, Germany (years 2018, 2021) \u2022 JFokus, Stockholm, Sweden (year 2019) \u2022 Devops Con, Munich, Germany (year 2019) \u2022 Oracle CodeOne, San Francisco, USA (years 2018, 2019) \u2022 Devoxx, Antwerp, Belgium (year 2018) \u2022 JPrime, Sofia, Bulgaria (years 2017, 2018) \u2022 Java2Days, Sofia, Bulgaria (years 2016, 2018) \u2022 EclipseCon, France (year 2018) \u2022 JavaOne, San Francisco, USA (years 2016, 2017) \u2022 Oracle Code, Prague, Czechia (year 2017) \u2022 Devoxx, London, UK (year 2017) \u2022 GeeCon, Krakow, Poland (year 2017) \u2022 W-JAX, Munich, Germany (years 2016, 2017) \u2022 Bed-Con, Berlin, Germany (year 2017) \u2022 Oredev, Malmo, Sweden (year 2017) \u2022 Devoxx, Casablanca, Morocco (year 2017) \u2022 Java Developer Days, Krakow, Poland (year 2016)","sameAs":["https:\/\/www.facebook.com\/ondrej.mihalyi","https:\/\/cz.linkedin.com\/in\/mihalyiondrej","https:\/\/twitter.com\/https:\/\/twitter.com\/OndroMih"],"url":"https:\/\/ondro.inginea.eu\/index.php\/author\/ondrejm\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/ondro.inginea.eu\/wp-content\/uploads\/2017\/10\/hotswapagent-logo.png?fit=140%2C46&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6wlb6-8B","jetpack-related-posts":[{"id":311,"url":"https:\/\/ondro.inginea.eu\/index.php\/started-working-as-payara-engineer\/","url_meta":{"origin":533,"position":0},"title":"Started working as Payara engineer","author":"Ondro Mih\u00e1lyi","date":"3 April, 2016","format":false,"excerpt":"Recently I made a small shift in my career, exchanging series of jobs and projects as a Java developer for a job to support and promote a great open-source product - Payara server. I made a leap from a developer who just enjoys the quality of lots of open-source software,\u2026","rel":"","context":"In &quot;Events &amp; Conferences&quot;","block_context":{"text":"Events &amp; Conferences","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/events-conferences\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":365,"url":"https:\/\/ondro.inginea.eu\/index.php\/my-recent-talks-at-jug-in-prague\/","url_meta":{"origin":533,"position":1},"title":"My recent talks at JUG in Prague","author":"Ondro Mih\u00e1lyi","date":"29 July, 2016","format":false,"excerpt":"In June, I had a public presentation at a Java User Group in Prague. It was the first time I gave my new talk about building reactive applications with Java EE. And as a bonus, I wanted to introduce Payara project and how it relates to the GlassFish project.I was\u2026","rel":"","context":"In &quot;Events &amp; Conferences&quot;","block_context":{"text":"Events &amp; Conferences","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/events-conferences\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/ZdhGuoTYOIE\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":330,"url":"https:\/\/ondro.inginea.eu\/index.php\/payara-update-may-2016\/","url_meta":{"origin":533,"position":2},"title":"Payara update &#8211; May 2016","author":"Ondro Mih\u00e1lyi","date":"30 May, 2016","format":false,"excerpt":"In March, I've started working for Payara and I've definitely enjoyed it since then. It's been very refreshing. I really love all the new experience, including the startup-like company culture (have a look at the courageous company web site) being part of the Payara open-source project and community helping customers\u2026","rel":"","context":"In &quot;Payara&quot;","block_context":{"text":"Payara","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/payara\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/6QVBsH6IjEA\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":513,"url":"https:\/\/ondro.inginea.eu\/index.php\/oracle-to-open-javaee-what-to-expect\/","url_meta":{"origin":533,"position":3},"title":"Oracle announced to open JavaEE &#8211; what to expect in the future?","author":"Ondro Mih\u00e1lyi","date":"26 August, 2017","format":false,"excerpt":"Last week, Oracle announced their intentions to open Java EE and transfer it to an open source foundation to continue its development in a more open way. I've been involved in some email discussions (here and here) and in a conference call organized by Oracle and\u00a0I want to summarize what\u2026","rel":"","context":"In &quot;Opinions&quot;","block_context":{"text":"Opinions","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/opinion\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":806,"url":"https:\/\/ondro.inginea.eu\/index.php\/possible-ways-to-use-arquillian-in-jakarta-ee-tcks\/","url_meta":{"origin":533,"position":4},"title":"Possible ways to use Arquillian in Jakarta EE TCKs","author":"Ondro Mih\u00e1lyi","date":"12 April, 2020","format":false,"excerpt":"Recently, we had a discussion how to create a standalone Jakarta Batch test kit (TCK). For most of the committers, it's pretty natural to use Arquillian to abstracts tests away from how they are executed on an implementation. But Romain proposed an intriguing idea to use plain JUnit5 that got\u2026","rel":"","context":"In &quot;Jakarta EE&quot;","block_context":{"text":"Jakarta EE","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/java\/jakarta-ee\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":567,"url":"https:\/\/ondro.inginea.eu\/index.php\/configure-passwords-in-payara-server-and-glassfish\/","url_meta":{"origin":533,"position":5},"title":"Configure Payara Server passwords in Docker","author":"Ondro Mih\u00e1lyi","date":"23 November, 2017","format":false,"excerpt":"Answering Stackoverflow questions provides a great feedback for finding out gaps in the official documentation of my favourite opensource tools. One of the questions which I answered here was how to change Payara Server master password in docker container. Obviously, in a standard server installation, this is simple - just\u2026","rel":"","context":"In &quot;Payara&quot;","block_context":{"text":"Payara","link":"https:\/\/ondro.inginea.eu\/index.php\/category\/payara\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/533"}],"collection":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/comments?post=533"}],"version-history":[{"count":18,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/533\/revisions"}],"predecessor-version":[{"id":868,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/posts\/533\/revisions\/868"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/media\/553"}],"wp:attachment":[{"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/media?parent=533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/categories?post=533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/tags?post=533"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ondro.inginea.eu\/index.php\/wp-json\/wp\/v2\/series?post=533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}