Monday, August 12, 2013

Moving from Eclipse to IntelliJ

Well, the second shoe dropped. The final straw was placed on the camel's back and the camel's back broke. I tried one more time and, once again, Eclipse still doesn't have a good Maven integration - at least for such a large project as RHQ.

Now, for some history, I've been using Eclipse for at least a decade. I like it. I know it. I'm comfortable with it. While I can't claim to know how to use everything in it, I can navigate around it pretty good and can pump out some code using it.

However, the Maven integration is just really bad from my experience. I've tried, I really have. In fact, it has been an annual ritual of mine to install the latest Maven plugin and see if it finally "just works" for me. I've done this for at least the last three years if not longer. So it is not without a lack of trying. Every year I keep hearing "try it again, it got better." (I really have heard this over the span of years). But every time I install it and load in the RHQ project, it doesn't "just work". I tried it again a few weeks ago and nothing has changed. What I expect is to import my root Maven module and have Eclipse load it in and let me just go back to doing my work. Alas, it has never worked.

I hate to leave Eclipse because, like I said, I have at least a decade invested in using it. But I need a good Maven integration. I don't want to have tons of Eclipse projects in my workspace - but then again, if the Eclipse Maven plugin needs to create one project per Maven module so it "just works", so be it. I can deal with it (after all, IntelliJ has tons of modules, even if it places them under one main project). But I can't even get that far.

So, after hearing all the IntelliJ fanboys denigrate Eclipse and tell me that I should move to IntelliJ because "it's better", I finally decided to at least try it.

Well, I can at least report that IntelliJ's Maven integration actually does seem to "just work" - but that isn't to say I didn't have to spend 15 minutes or so figuring out some things to get it to work (I had to make sure I imported it properly and I had to make sure to set some options). But spending 15 minutes and getting it to work is by far better than what I've gone through with Eclipse (which is, spending lots more time and never getting it to work over the years). So, yes, I can confirm that the IntelliJ folks are correct that Maven integration "just works" - with that small caveat. It actually is very nice.

In addition, I really like IntelliJ's git integration - it works out of box and has some really nice features.

I also found that IntelliJ provides an Eclipse keymap - so, while I may not like all the keystrokes required to unlock all the features in IntelliJ (more on that below), I do like how I can use many of the Eclipse keystrokes I know and have it work in IntelliJ.

As I was typing up this blog, I was about to rail on IntelliJ about its "auto-save" feature. Reading their Migration FAQ they make it sound like you can't turn off that auto-save feature (where, as soon as you type, it saves the file). I really hate that feature. But, I just found out, to my surprise, you can kinda turn that off. It still maintains the changes though, in what I suppose is a cache of changed files. So if I close the editor with the changed file, and open it back up again, my changes are still there. That's kinda annoying (but yet, I can see this might be useful, too!). But at least it doesn't change the source file. I'll presume there is a way to throw away these cached changes - at least I can do a git revert and that appears to do it.


However, with all that said, as I use IntelliJ (and really, it's only been about week), I'm seeing on the edges of it things that I do not like where Eclipse is better. If you are an IntelliJ user and know how to do the following, feel free to point out my errors. Note: I'm using the community version of  IntelliJ v12.14.

For one thing, where's the Problems View that Eclipse has? I mean, in Eclipse, I have a single view with all the compile errors within my project. I do not see anywhere in IntelliJ a single view that tells me about problems project-wise. Now, I was told that this is because Eclipse has its own compiler and IntelliJ does not. That's an issue for me. I like being able to change some code in a class, and watch the Problems View report all the breakages that that change causes. I see in the Project view, you can limit the scope to problem files. That gets you kinda there - but I want to see it as a list (not a tree) and I want to see the error messages themselves,  not just what files have errors in them.

Second, the Run/Debug Configuration feature doesn't appear to be as nice as Eclipse. For example, I have some tool configurations in Eclipse that, when selected, prompt the user for parameter values, but apparently, IntelliJ doesn't support this. In fact, Eclipse supports lots of parameter replacement variables (${x}) whereas it doesn't look like IntelliJ supports any.

Third, one nice feature in Eclipse is the ability to have the source code for a particular method to popup in a small window when you hover over a method call while holding down, say, the ALT key (this is configurable in  Eclipse). But, I can't see how this is done in IntelliJ. I can see that View->QuickDefinition does what I want, but I just want to hold down, say, ALT or SHIFT and have the quick definition popup where I hover. I have a feeling you can tell IntelliJ to do this, I just don't know how.

Another thing I am missing is an equivalent to Eclipse's "scrapbook" feature. This was something I use(d) all the time. In any scrapbook page, you can add and highlight any Java snippet and execute it. The Console View shows the output of the Java snippet. This is an excellent way to quickly run some small code snippet you want to try out to make sure you go it right (I can't tell you how many times I've used it to test regex's). The only way it appears you can do this in IntelliJ is if you are debugging something and you are at a breakpoint. From there, you can execute random code snippets. But Eclipse has this too (the Display view). I want a way to run a Java snippet right from my editor without setting up a debug session.

I also don't want to see this "TODO" or "JetGradle" or other views that IntelliJ seems to insist I want. You can't remove them from the UI entirely.

Finally, IntelliJ seems to be really keen on keyboard control. I am one of those developers that hates relying on keystrokes to do things. I am using a GUI IDE, I want to use the GUI :-) I like mouse/menu control over keystrokes. I just can't remember all the many different key combinations to do things, plus my fingers can't consistently reach all the F# function keys, but I can usually remember where in the menu structure a feature is. I'm sure as I use IntelliJ more that I'll remember more. And most everything does seem to have a main menu or popup-menu equivalent. So, this is probably just a gripe that I have to spend time on a learning curve to learn a new tool - can't really blame IntelliJ for that (and with the Eclipse keymap, lots of Eclipse keystrokes now map in IntelliJ). I guess I have to blame Eclipse for that since it's forcing me to make this move in the first place.

Some of those are nit-picky, others not. And I'm sure I'll run into more things that either IntelliJ doesn't have or is hiding from me. Maybe as I use IntelliJ more, and my ignorance of it recedes a bit, I'll post another blog entry to indicate my progress.

8 comments:

  1. Did you try the current experimental m2e 1.5 version? It can be found at http://nexus.tesla.io:8081/nexus/content/sites/m2e.extras/m2e/1.5.0/N/LATEST/. Also the JBoss Tools guys are promising further improvements.

    ReplyDelete
    Replies
    1. As I wrote, "Every year I keep hearing 'try it again, it got better.' (I really have heard this over the span of years). But every time I install it and load in the RHQ project, it doesn't 'just work'."

      At least now I can say I heard something of that sort again in 2013 :-)

      Yes, I heard people are promising further improvements. As I said, I've been hearing that for years.

      I'm willing to admit that, for all I know, it may just happen to be that this latest build of m2e really does, in fact, "just work" (I tried the build from a month or two ago and it didn't). I really do hope that this is the case because I do want m2e and the Eclipse project as a whole to succeed.

      But it is just time for me to finally cut bait and move on. I've wasted alot of time trying to get this to work over the years. And since it took me only about 15 minutes to get it to work in IntelliJ (and I had absolutely no experience using IntelliJ prior to that) I thought... hmmm... maybe I should give IntelliJ a try. But, if IntelliJ, as a development IDE, doesn't work out for me, I'll move back and try m2e _again_.

      Delete
  2. John, can you tell me which root project you are trying to import ?

    wildfly definitely triggers issues but would be nice with another project to compare with and suggest/contribute fixes to m2e to fix what we find.

    ReplyDelete
    Replies
    1. Max - RHQ project is here:

      https://git.fedorahosted.org/cgit/rhq/rhq.git/

      The root maven module is located there at the top directory:

      https://git.fedorahosted.org/cgit/rhq/rhq.git/tree/pom.xml

      Delete
  3. John,

    I think I can help with some of the issues you were having with IntelliJ. Some of which are not very obvious:

    Autosave: Preferences --> General --> Synchronization --> "Save files automatically if application is idle for XXXX sec."

    1) Problems View: IJ needs to do the compile (not an external cmd line compile). So do a Build --> 'Make Project then the errors will show up down in the Messages Window at the bottom of the screen. Pay attention to the output path of the class files if you are having IJ do the compile (make sure it corresponds to where the cmd line is putting the files). If this is too much to view you can combine this with Scopes to limit the views to certain packages, etc...

    2) Run Debug Configuration: It is not as powerful as Eclipse but does have Preferences --> Path Variables that can be set and substituted

    3) All Menus/Commands are configurable. Preferences --> Keymap: type 'View Definition' in the little search box in the top right to find it. Double Click on 'View Definition' and select 'Add Mouse Shortcut' from the little dropdown menu that appears. Click the radio button 'Single Click' hold down the keystroke that you want to use (like 'ctrl') and click on the 'click here to add mouse shortcut'. Pay attention to any conflicts and resolve them. Now when you ctrl-click with your mouse the 'View Definition' window comes up. This can be done with anything.

    4) You can remove Commander or JetGradle; those are just plugins (Preferences --> Plugins) that you can disable and they will go away. Although, I'm not sure how to get rid of Todo tab.

    The scrapbook feature is also just a plugin that you can enable (in fact there are several: eSnippet, iSnippet,Snipplr) via
    Preferences --> Plugins --> Browse Repositories --> Right click --> Download and Install.

    I think you are right about IJ being about keyboard control, in fact you can even make it total keyboard adding the IdeaVIM plugin so you don't have to use the mouse at all.

    Hope that helps,

    Mike

    ReplyDelete
  4. The maven support is pretty good in IntelliJ; some of the not-so-obvious features are highlighted in this video: http://tv.jetbrains.net/videocontent/maven-support-in-intellij-idea

    ReplyDelete
  5. -The scrapbook for is simply groovy shell plugin. Very often use it.
    -The quick view of source code for particular method can be done by placing caret somewhere in the method name and hitting ctrl+shift+i

    By the way, try to use alt+enter and IDEA's feature of so called middle matching (when use want to auto-complete method, class name or whatever with longCamelCaseName simply by typing something like "loCaNa" and IDEA magically promts you this method) - this is where you can become IDEA addicted.

    And also nice guide to most basic and useful features of IDEA : http://blog.jetbrains.com/idea/tag/30-days-guide/

    ReplyDelete
  6. > I use Eclipse kepler to view the dependency tree. didn't find this feature in intellij.

    ReplyDelete