SBT application reload invariably fails when program uses javax.mail

sbt
(Nils Weinander) #1

I have the same problem in both Play 2.3 and 2.6. If the program imports from javax.mail, SBT reload invariably crashes with

play.sbt.PlayExceptions$UnexpectedException: Unexpected exception[ClassCastException: 
java.lang.Integer cannot be cast to java.lang.String]
	at play.sbt.run.PlayReload$.$anonfun$taskFailureHandler$1(PlayReload.scala:35)
	at scala.Option.map(Option.scala:146)
	at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:28)
	at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:24)
	at play.sbt.run.PlayReload$.$anonfun$compile$3(PlayReload.scala:51)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at org.apache.ivy.core.settings.IvySettings.addAllVariables(IvySettings.java:589)
	at org.apache.ivy.core.settings.IvySettings.addAllVariables(IvySettings.java:583)
	at org.apache.ivy.core.settings.IvySettings.addSystemProperties(IvySettings.java:303)
	at org.apache.ivy.core.settings.IvySettings.<init>(IvySettings.java:298)
	at org.apache.ivy.core.settings.IvySettings.<init>(IvySettings.java:218)

After this I have to stop sbt and restart from the shell.

If I comment out the javax.mail references, there is no exception. I have tried different sources for javax.mail in the depencies section in build.sbt:


"javax.mail" % "mail" % "1.4.7",
"javax.mail" % "javax.mail-api" % "1.6.2",
"com.sun.mail" % "javax.mail" % "1.6.2"

with the same exception as result. This is a major annoyance, having to restart everything hard after every code change. Is there anything I can do?

(Matthias Kurz) #2

Looks like javax.mail sets System properties which are not type of String (just a guess).

However, not being able to handle System properties of types other than String was a bug in Apache Ant Ivy, which got fixed already:

The problem now is that sbt is using a forked Apache Ant Ivy, which isn’t up-to-date with the upstream project yet, meaning the referenced patch didn’t make it in that fork yet.

That’s why I just opened a pull request with exactly that patch:


If that pull request gets accepted it should make it into the next sbt release and your problem should be fixed.

Kind regards,
Matthias

(Nils Weinander) #3

Great, thanks. I’m quite some way behind in sbt versions, so I might run into other problems on the way, but I’m happy to have finally figured this one out!

Btw, I can confirm:

		properties = System.getProperties();
		properties.put("mail.transport.protocol", "smtp");
		properties.put("mail.smtp.port", PORT);
		properties.put("mail.smtp.auth", "true");
		properties.put("mail.smtp.starttls.enable", "true");
		properties.put("mail.smtp.starttls.required", "true");

If I comment out properties.put(“mail.smtp.port”, PORT); there is no exception.

1 Like
(Matthias Kurz) #4

If I comment out properties.put(“mail.smtp.port”, PORT); there is no exception.

:+1: That confirms my guess.

Can you try this workaround, making the port a String instead of an Integer?

properties.put("mail.smtp.port", "" + PORT);

Let’s see if javax mail picks that up correctly…

(Nils Weinander) #5

I can try but it will probably not work, as mail.smtp.port is supposed to be int: http://connector.sourceforge.net/doc-files/Properties.html

That said, now that I know the problem, I can simply comment out just that line, as I actually send mail only in production.