docs: @Override
  	public String install() throws InstallException {
  		// On Linux, for whatever reason, relative paths in your eclipse.ini file don't work, but only for -javaagent.
  		// On Windows, since the Oomph, the generated shortcut starts in the wrong directory.
  		// So the default is to use absolute paths, breaking lombok when you move the eclipse directory.
  		// Or not break when you copy your directory, but break later when you remove the original one.
  		boolean fullPathRequired = !"false".equals(System.getProperty("lombok.installer.fullpath", "true"));
  		
  		boolean installSucceeded = false;
  		StringBuilder newContents = new StringBuilder();
  		
  		File lombokJar = new File(eclipseIniPath.getParentFile(), "lombok.jar");
  		
  		/* No need to copy lombok.jar to itself, obviously. On windows this would generate an error so we check for this. */
  		if (!Installer.isSelf(lombokJar.getAbsolutePath())) {
  			File ourJar = findOurJar();
  			byte[] b = new byte[524288];
  			boolean readSucceeded = true;
  			try {
  				FileOutputStream out = new FileOutputStream(lombokJar);
  				try {
  					readSucceeded = false;
  					InputStream in = new FileInputStream(ourJar);
  					try {
  						while (true) {
  							int r = in.read(b);
  							if (r == -1) break;
  							if (r > 0) readSucceeded = true;
  							out.write(b, 0, r);
  						}
  					} finally {
  						in.close();
  					}
  				} finally {
  					out.close();
  				}
  			} catch (IOException e) {
  				try {
  					lombokJar.delete();
  				} catch (Throwable ignore) { /* Nothing we can do about that. */ }
  				if (!readSucceeded) throw new InstallException(
  						"I can't read my own jar file. I think you've found a bug in this installer!\nI suggest you restart it " +
  						"and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\n" +
  						"http://groups.google.com/group/project-lombok - Thanks!", e);
  				throw new InstallException("I can't write to your " + descriptor.getProductName() + " directory at " + name + generateWriteErrorMessage(), e);
  			}
  		}
  		
  		/* legacy - delete lombok.eclipse.agent.jar if its there, which lombok no longer uses. */ {
  			new File(lombokJar.getParentFile(), "lombok.eclipse.agent.jar").delete();
  		}
  		
  		try {
  			FileInputStream fis = new FileInputStream(eclipseIniPath);
  			try {
  				BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  				String line;
  				while ((line = br.readLine()) != null) {
  					if (JAVA_AGENT_LINE_MATCHER.matcher(line).matches()) continue;
  					Matcher m = BOOTCLASSPATH_LINE_MATCHER.matcher(line);
  					if (m.matches()) {
  						StringBuilder elemBuilder = new StringBuilder();
  						elemBuilder.append("-Xbootclasspath/a:");
  						boolean first = true;
  						for (String elem : m.group(1).split(Pattern.quote(File.pathSeparator))) {
  							if (elem.toLowerCase().endsWith("lombok.jar")) continue;
  							/* legacy code -see previous comment that starts with 'legacy' */ {
  								if (elem.toLowerCase().endsWith("lombok.eclipse.agent.jar")) continue;
  							}
  							if (first) first = false;
  							else elemBuilder.append(File.pathSeparator);
  							elemBuilder.append(elem);
  						}
  						if (!first) newContents.append(elemBuilder.toString()).append(OS_NEWLINE);
  						continue;
  					}
  					
  					newContents.append(line).append(OS_NEWLINE);
  				}
  				br.close();
  			} finally {
  				fis.close();
  			}
  			
  			String pathPrefix;
  			if (fullPathRequired) {
  				pathPrefix = lombokJar.getParentFile().getCanonicalPath() + File.separator;
  			} else {
  				pathPrefix = pathToLombokJarPrefix;
  			}
  			
  			newContents.append(String.format(
  					"-javaagent:%s", escapePath(pathPrefix + "lombok.jar"))).append(OS_NEWLINE);
  			
  			FileOutputStream fos = new FileOutputStream(eclipseIniPath);
  			try {
  				fos.write(newContents.toString().getBytes());
  			} finally {
  				fos.close();
  			}
  			installSucceeded = true;
  		} catch (IOException e) {
  			throw new InstallException("Cannot install lombok at " + name + generateWriteErrorMessage(), e);
  		} finally {
  			if (!installSucceeded) try {
  				lombokJar.delete();
  			} catch (Throwable ignore) {}
  		}
  		
  		if (!installSucceeded) {
  			throw new InstallException("I can't find the " + descriptor.getIniFileName() + " file. Is this a real " + descriptor.getProductName() + " installation?", null);
  		}
  		
  		return "If you start " + descriptor.getProductName() + " with a custom -vm parameter, you'll need to add:<br>" +
  				"<code>-vmargs -javaagent:lombok.jar</code><br>as parameter as well.";
  	}