Before I get started, please note this guide is specifically made for IntelliJ. The same concepts may be achievable in other IDE's, but I don't know how. Also, sorry in advance for how many images, but I feel they're necessary, as when I've tried to explain this process in the past, people simply couldn't find the options I was referring to. First, there are a couple of things you'll need to install. In IntelliJ, download the HotswapAgent plugin, and the Run Configuration as Action plugin. The latter allows us to bind maven/gradle tasks to a button, which can then be binded to a keybind. You'll also need DCEVM. Assuming you're using HotSpot, the default hotswapping capabilities of are extremely limited, restricting you to only being able to hotswap method bodies. DCEVM greatly improves upon this, by allowing you to hotswap nearly anything. DCEVM can either be added onto an existing JDK (<8), or fully replace the JDK (<11). I'm going over the latter in this guide, but the former isn't necessarily difficult to achieve either. Download the latest binary zip from here, then extract it into C:\Program Files\Java\. Your directory tree should look something like this after: You may be wondering, why not jRebel? Simple fact is, the company behind them are extremely greedy, and do not offer free licenses, or even discounted ones anymore. It's not exactly affordable either iirc, and while hotswapping is extremely useful, jrebel's price just isn't justifiable. So, while DCEVM isn't as supported, probably isn't as stable, and may have unknown semantics, it's really the only option available to your average hobbyist developer. We can now move onto actually setting up the IDE. The first step, is creating your build task. If using maven, click on ADD CONFIGURATION in the top right corner of your screen. In the window that opens, click the + in the top left, and select Maven I'd recommend just calling it Package, but it's entirely up to you. Set the Command line to package You can then click Apply and then OK at the bottom right. If using gradle, executing a task will automatically create a configuration for you. For example, running shadowJar will automatically create a shadowJar configuration. Upon completion and validation that the configuration is working, press control + alt + s to open up settings. Then navigate to the Appearance & Behaviour section, and click Menus and Toolbars. Find and open the Navigation Bar Toolbar dropdown, and figure out where you want to position the item. I usually put mine after Run anything. Simply highlight the element that's above the position you wish to place your icon in, then click the + at the top of the window, and select Add Action Open Plug-ins > Run Configuration as Action, and find your task. If you deem it necessary, you can set an icon like I've done myself, however it's purely cosmetic. Click on the task, then click OK. Verify that the icon is on your toolbar, by clicking Apply and OK in the bottom right corner of your Settings window, then looking for the icon. If it's there, open settings back up with ctrl + alt + s, then open the keymap section. Navigate to Plug-ins > Run Configuration as Action > your task, right click on it, and add keyboard shortcut. I personally use ctrl + b, but it's up to you. Once set, in the search box in the top right, search Reload Changed Classes. Add a binding for Main menu > Run > Reload Changed Classes. I personally use alt + r. Lovingly caress the Apply and OK buttons, and verify your build keybind is working. We'll test alt + r later. For absolute maximum efficiency, I'd recommend configuring your build tool to automatically output the jar into your test server's plugin folder. Speaking of test servers, let's set one up. Actually... not so fast, before we can do that, we need to set our JDK. Open project structure (control + shift + alt + s), and click project. Then, click new in the Project SDK section. Navigate to the path your dcevm installation is at, and add it. Then select said installation. Also change the project language level to 11. Once again, hit apply and ok. Ok, now we can create the test server. Create a new folder in your projects root directory, and call it whatever you want, then put your spigot jar in. Click on the top right, where your configurations are, and add a new configuration. Set it to Jar Application. Fill it out with the path to your jar, and the directory your jar is in. If you wish, you can add -DIReallyKnowWhatIAmDoingISwear as a VM option, which will stop the outdated spigot warning from showing. Set the JRE to the one we added before. Apply & OK. Verify the server is working by starting it, and accepting the eula ofc. Let it run through it's world gen stage, then stop is via the proper command. Believe it or not, that was the last stage, everything is ready now. Set your current configuration to the spigot server. You'll be able to run this with shift + f9, and build the plugin with whatever bind you set earlier. If the server is running and you've changed the code, use your reload keybind to hotswap.