@@ -188,50 +188,43 @@ public Class<?> compile(String script) throws ScriptException {
188188 File file = path == null ? null : new File (path );
189189
190190 final Writer writer = getContext ().getErrorWriter ();
191+ final Builder builder = new Builder ();
191192 try {
192-
193- final Builder builder ;
194-
195193 if (file != null && file .exists ()) {
196194 // if the filename set in engine scope bindings is valid,
197195 // ignore the given script and use that file instead.
198- builder = new Builder (file , writer );
196+ builder . initialize (file , writer );
199197 }
200198 else {
201199 // script may be null, but then we cannot create a StringReader for it,
202200 // therefore null is passed if script is null.
203201 final Reader reader =
204202 (script == null ) ? null : new StringReader (script );
205- builder = new Builder (reader , writer );
203+ builder . initialize (reader , writer );
206204 }
207205 final MavenProject project = builder .project ;
208206 String mainClass = builder .mainClass ;
209207
210- try {
211- project .build (true );
208+ project .build (true );
209+ if (mainClass == null ) {
210+ mainClass = project .getMainClass ();
212211 if (mainClass == null ) {
213- mainClass = project .getMainClass ();
214- if (mainClass == null ) {
215- throw new ScriptException ("No main class found for file " + file );
216- }
212+ throw new ScriptException ("No main class found for file " + file );
217213 }
214+ }
218215
219- // make class loader
220- String [] paths = project .getClassPath (false ).split (File .pathSeparator );
221- URL [] urls = new URL [paths .length ];
222- for (int i = 0 ; i < urls .length ; i ++)
223- urls [i ] =
224- new URL ("file:" + paths [i ] + (paths [i ].endsWith (".jar" ) ? "" : "/" ));
216+ // make class loader
217+ String [] paths = project .getClassPath (false ).split (File .pathSeparator );
218+ URL [] urls = new URL [paths .length ];
219+ for (int i = 0 ; i < urls .length ; i ++)
220+ urls [i ] =
221+ new URL ("file:" + paths [i ] + (paths [i ].endsWith (".jar" ) ? "" : "/" ));
225222
226- final URLClassLoader classLoader = new URLClassLoader (urls , Thread .currentThread ()
227- .getContextClassLoader ());
223+ final URLClassLoader classLoader = new URLClassLoader (urls , Thread .currentThread ()
224+ .getContextClassLoader ());
228225
229- // load main class
230- return classLoader .loadClass (mainClass );
231- }
232- finally {
233- builder .cleanup ();
234- }
226+ // load main class
227+ return classLoader .loadClass (mainClass );
235228 }
236229 catch (Exception e ) {
237230 if (writer != null ) {
@@ -244,6 +237,9 @@ public Class<?> compile(String script) throws ScriptException {
244237 throw new ScriptException (e );
245238 }
246239 }
240+ finally {
241+ builder .cleanup ();
242+ }
247243 return null ;
248244 }
249245
@@ -292,20 +288,19 @@ public void compile(final File file) {
292288 * @see #compile(String)
293289 */
294290 public void compile (final File file , final Writer errorWriter ) {
291+ final Writer writer =
292+ (errorWriter == null ) ? getContext ().getErrorWriter () : errorWriter ;
293+ final Builder builder = new Builder ();
295294 try {
296- final Writer writer =
297- (errorWriter == null ) ? getContext ().getErrorWriter () : errorWriter ;
298- final Builder builder = new Builder (file , writer );
299- try {
300- builder .project .build ();
301- }
302- finally {
303- builder .cleanup ();
304- }
295+ builder .initialize (file , writer );
296+ builder .project .build ();
305297 }
306298 catch (Throwable t ) {
307299 printOrThrow (t , errorWriter );
308300 }
301+ finally {
302+ builder .cleanup ();
303+ }
309304 }
310305
311306 /**
@@ -319,22 +314,21 @@ public void compile(final File file, final Writer errorWriter) {
319314 public void makeJar (final File file , final boolean includeSources ,
320315 final File output , final Writer errorWriter )
321316 {
317+ final Builder builder = new Builder ();
322318 try {
323- final Builder builder = new Builder (file , errorWriter );
324- try {
325- builder .project .build (true , true , includeSources );
326- final File target = builder .project .getTarget ();
327- if (output != null && !target .equals (output )) {
328- BuildEnvironment .copyFile (target , output );
329- }
330- }
331- finally {
332- builder .cleanup ();
319+ builder .initialize (file , errorWriter );
320+ builder .project .build (true , true , includeSources );
321+ final File target = builder .project .getTarget ();
322+ if (output != null && !target .equals (output )) {
323+ BuildEnvironment .copyFile (target , output );
333324 }
334325 }
335326 catch (Throwable t ) {
336327 printOrThrow (t , errorWriter );
337328 }
329+ finally {
330+ builder .cleanup ();
331+ }
338332 }
339333
340334 /**
@@ -368,14 +362,17 @@ private void printOrThrow(Throwable t, Writer errorWriter) {
368362 */
369363 private class Builder {
370364
371- private final PrintStream err ;
372- private final File temporaryDirectory ;
365+ private PrintStream err ;
366+ private File temporaryDirectory ;
373367 private String mainClass ;
374368 private MavenProject project ;
375369
376370 /**
377371 * Constructs a wrapper around a possibly project for a source or maven
378372 * project file.
373+ * <p>
374+ * This method is intended to be called only once.
375+ * </p>
379376 *
380377 * @param file the {@code .java} file to build (or null, if {@code reader}
381378 * is set).
@@ -388,7 +385,7 @@ private class Builder {
388385 * @throws TransformerException
389386 * @throws TransformerFactoryConfigurationError
390387 */
391- private Builder (final File file , final Writer errorWriter )
388+ private void initialize (final File file , final Writer errorWriter )
392389 throws ScriptException , IOException , ParserConfigurationException ,
393390 SAXException , TransformerConfigurationException , TransformerException ,
394391 TransformerFactoryConfigurationError
@@ -411,6 +408,9 @@ private Builder(final File file, final Writer errorWriter)
411408 /**
412409 * Constructs a wrapper around a possibly temporary project for source code
413410 * generated by a Reader.
411+ * <p>
412+ * This method is intended to be called only once.
413+ * </p>
414414 *
415415 * @param reader provides the Java source if {@code file} is {@code null}
416416 * @param errorWriter where to write the error output.
@@ -422,7 +422,7 @@ private Builder(final File file, final Writer errorWriter)
422422 * @throws TransformerException
423423 * @throws TransformerFactoryConfigurationError
424424 */
425- private Builder (final Reader reader , final Writer errorWriter )
425+ private void initialize (final Reader reader , final Writer errorWriter )
426426 throws ScriptException , IOException , ParserConfigurationException ,
427427 SAXException , TransformerConfigurationException , TransformerException ,
428428 TransformerFactoryConfigurationError
0 commit comments