This is a blog like article with a FAQ for d3web developers transitioning from Eclipse to IntelliJ IDEA:

Create a new Plugin-Module#

  • right click on the respective parent module
  • "new" -> "Module"
  • select "Maven"
  • select no archetype when asked
  • Enter the name of your plugin for "Module Name"
  • Change the entry of "Content root" using the "..." button, create new subfolder within the parent module named according to your plugin name, select this folder for "Content root" and "Module file location"
  • hit next/finish
  • (if your intelliJ is not configured to auto-import maven modules:) Import the project as maven module

Import current code styles#

Download the attached code_styles.jar(info) and import them with File -> Import settings.

Add copyright header#

Download the attached copyright.txt(info) and add it the following way:

The provided copyright.txt is for the denkbares GmbH, but can easily be changed to other firms or e.g. the university.

Adding new files and classes to version control automatically:#

Go to File -> Settings -> Version control -> Confirmation -> When files are created. You're probably looking for "Add silently".

Save actions like in eclipse#

Edit -> Macros -> Start macro recording

Now we record the actual macro simulating our Save actions:

  1. Code -> Reformat Code (formats the code according to the code style/template, also allows to optimize inputs)
  2. File -> Save all
  3. Build -> Compile (compiles the changes which also causes them to be hot swapped when in debug)

Edit -> Marcros -> Stop macro recording

After that, I bound the macro to "Cmd + Alt + S". This way I still have the normal save, but also the macro which does more...

Show Javadoc#

Use View -> Quick Documentation or the corresponding keyboard shortcut (depends on OS and Keymap).
On Mac OSX with Eclipse keymap, F2 Works.

It's also possible to enable automatic JavaDoc popup on code completion in Preferences -> Editor -> Code completion (Autopopup documentation).
At the beginning this worked for me (somewhat clitching), but now it no longer works :(

Use Identical Path for JUnit and Maven Testing#

Unfortunately JUnit in IntelliJ IDEA has a different path for executing JUnit tests in modules as it will have when testing in maven builds. You can change this unwanted default behaving by setting the default JUnit path in the Run Configuration default settings for JUnit:

Open Menu Run->Edit configuration and there go to Defaults->JUnit->Working directory and set the value to $MODULE_DIR$.

After that IntelliJ IDEA will set the relative path in all JUnits just like Maven.

Running Headless-App-Tests in JUnit#

To run the Headless-App-Tests in JUnit (e.g. for debugging), create/add a new JUnit Configuration. In the configuration, make sure to use the settings displayed below. Make sure you select the Working directory of the "KnowWE-Headless-App", and select the classpath of the module "KnowWE-Headless-App". "Test kind" has to be "Class" and "Fork mode" has to be "none", otherwise debugging is not possible.

Sorting of import statements#

By default IntelliJ has different order of import statements as Eclipse. To avoid having these change every time a class is edited in the different IDEs, we should adjust the order in IntelliJ. This can be done under Code Style -> Java - > Imports. The order should be:

  1. import java.*
  2. <blank line>
  3. import javax.*
  4. <blank line>
  5. import all other imports
  6. <blank line>
  7. import cc.denkbar.*
  8. import com.denkbares.*
  9. import de.*
  10. <blank line>
  11. import static all other imports

The above order will not quite avoid all changes, since Eclipse seems to additionally add blank lines between all imports with different first path elements, but this seems close enough for now. I think since it is a code style, this should also be part of the code style settings, which are also attached to this site.

Get Javascript code completion for jquery or other JavaScript Libraries#

  1. Open “Project Structure” dialog and choose “Global Libraries”.
  2. Click + button and choose “JavaScript” library type from the drop-down list.
  3. Specify your library name in the “Name” field.
After specifying the global jQuery library you need to make sure that it is defined in your file completion scope:
  1. Open Settings|JavaScript| Libraries
  2. Enable jquery and choose all (parent) projects you want code-completion for
  3. Afterwards click "Manage Scopes" and check that jquery is defined at Project level

Attention: After adding files to your library, they become read-only in IntelliJ. You should only add files as global libraries that you will not change often. Otherwise you need to removed them from the library as long as you edit them or only use an external copy of the files.

NotSerializableException on Tomcat startup#

During startup KnowWE/Tomcat often produces exceptions of the following kind:

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.ecyrd.jspwiki.auth.UserManager
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1970)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1894)
....

KnowWE still works, but the exceptions are annoying/irritating...
In eclipse it was possible to delete the work-folder in KnowWE-App, but in IntelliJ that does no longer work.

The solution is actually pretty simple, just deactivate session persistence in your Tomcat:

  1. Open file "%Tomcat_Home%/conf/context.xml"
  2. To disable the session persistence, uncomment the line <Manager pathname="" />

Debugging one thread of many#

For developers migrating from Eclipse to IntelliJ, the default behavior of breakpoints in IntelliJ might be unexpected. While Eclipse only suspends the thread that reached the breakpoint, IntelliJ also suspends all other threads when a breakpoint is reached.
This behavior can simply be changed in the settings of the breakpoint: Open the breakpoints panel in the debugger an navigate to your breakpoint. Right to the checkbox "Suspend" select the radio-button "Thread" instead of "All". On the right side of the panel you can also make this setting the default.

View all compile errors of the project/workspace#

IntelliJ does not have a view showing all current compile errors like Eclipse did, because it does not compile automatically on each change of the code.
For me, the best replacement so far has been the following:

  1. In the settings, search for "Java Compiler" and select "Eclipse" as compiler.
  2. Make sure that "Proceed on errors" is checked

If you now want to see all compile errors, e.g. after a "dirty refactoring":

  1. Go to "Build" and "Make Project". It may take a few seconds, but not many (< 10s for me). If you made changes with big impact in Eclipse, it would also compile for some time...
  2. You now see the errors and warnings in the Messages view and can go through them. You can hide warnings with a button in the tool bar of the view.
  3. Alternatively, select scope "Problems" in the Project view. Unfortunately this does not show all existing compile errors, but only the ones of the files you have already viewed.
There currently seems to be a problem with the eclipse compiler option using Java 8. If you are getting an error like "Error:java: source level should be comprised in between '1.3' and '1.7' (or '5', '5.0', ..., '7' or '7.0'): 8", switch back to Javac again.

Java dock entries on OSX#

To remove the dock entries that IntelliJ spawns when compiling or running Tomcat, append -Dapple.awt.UIElement=true to your Java VM options.

Migrating to Java 8 and JSPWiki 2.10 #

Since the end of July, we migrated KnowWE to now use JSPWiki 2.10, Java 8 and Tomcat 8. Follow this section to migrate your own workspace/project in IntelliJ:

  1. Install JDK 8 and add and set it as the default in your JDK. In IntelliJ, go to File -> Project Structure... -> SDKs and add the JDK 8. Under Project also in Project Structure..., set it as the default.
  2. Download the current Tomcat 8 as the zip version. Unzip it analogous to your Tomcat 6 and set it your Tomcat configurations in IntelliJ.
  3. jspwiki.properties is now jspwiki-custom.properties. Instead of in local/WEB-INF/ it is now in local/WEB-INF/classes/. It has basically the same content as before, but you should nevertheless start again from the .default file and just migrate your individual settings like var.basedir to the new file.

Java 8 and JSPWiki 2.10 issues#

Java source level error#

If you get an error like:

"Error:java: source level should be comprised in between '1.3' and '1.7' (or '5', '5.0', ..., '7' or '7.0'): 8"

you have to switch back to Javac as the compiler again. More info at IntelliJ FAQ#View all compile errors of the project/workspace(info)

SecurityManager/jspwiki.policy issues#

If you have an error with content like

"Failed to start managers: File /IntelliJ%20Workspaces/denkbares/KnowWE-App/target/KnowWE-App-0.2-SNAPSHOT/WEB-INF/jspwiki.policy does not exist, or the SecurityManager prohibited access to it."

your problem is very likely a whitespace in the path to the jspwiki.policy file. The SecurityManager of JSPWiki 2.10 does not like that. If the whitespace is in your workspace folder name, you can close IntelliJ, rename the folder, open IntelliJ again and then choose the new folder in the welcome splash screen after clicking "Open Project".

Error with com.ecyrd.jspwiki....#

If you get (class loading) exceptions involving the old pre 2.9. JSPWiki package naming while starting ab KnowWE, you most likely are dealing with one of the following issues:

  1. You are trying to start KnowWE with an old pre 2.9 JSPWiki plugin like the TablePlugin. Update or remove these plugins in your dependencies.
  2. There are leftover files in your workspace containing the old JSPWiki code with the wrong package names. Do a "Find in path" with "ecyrd" to quickly find them. Most likely you can delete or update them. In case the files are in one of the "Overlay" folders in KnowWE-Resources or KnowWE-App, you can delete them. Do a maven build afterwards.