我正在构建一个使用 JDBC 连接到 MySQL 的 Java 应用程序。我有一个 ant 脚本,它可以编译我的代码,然后将其与 log4j、junit、libshout-java 和 mysql jdbc 驱动程序一起打包成一个可执行 jar。这一切在 ubuntu 9.10 上运行良好,我的代码连接到 mysql,然后我们就可以开始了。
但是我的生产环境是 solaris(我的开发箱是 ubuntu),当我在那里构建和运行它时,出现了以下错误。
17 [main] DEBUG com.radiobusi.ShoutGen.ParseConfig - [SQL, SELECT * FROM RadioBusi.RadioBusi_song JOIN RadioBusi.RadioBusi_playlist WHERE RadioBusi_playlist.Name = 'Placebo 2';]
18 [main] DEBUG com.radiobusi.ShoutGen.ParseConfig - this is able to be broken up[SQL, SELECT * FROM RadioBusi.RadioBusi_song JOIN RadioBusi.RadioBusi_playlist WHERE RadioBusi_playlist.Name = 'Placebo 2';]
78 [main] ERROR com.radiobusi.ShoutGen - An error occured instantiating the class ShoutGen
java.lang.ExceptionInInitializerError
at com.mysql.jdbc.Util.stackTraceToString(Util.java:351)
at com.mysql.jdbc.Util.<clinit>(Util.java:116)
at com.mysql.jdbc.NonRegisteringDriver.parseURL(NonRegisteringDriver.java:672)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:277)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at com.radiobusi.ShoutGen.PlayList.<init>(Unknown Source)
at com.radiobusi.ShoutGen.ShoutGen.<init>(Unknown Source)
at com.radiobusi.ShoutGen.ShoutGen.main(Unknown Source)
Caused by: java.lang.RuntimeException: Can't load resource bundle due to underlying exception java.util.MissingResourceException: Can't find bundle for base name com.mysql.jdbc.LocalizedErrorMessages, locale en_AU
at com.mysql.jdbc.Messages.<clinit>(Messages.java:60)
... 9 more
Caused by: java.util.MissingResourceException: Can't find bundle for base name com.mysql.jdbc.LocalizedErrorMessages, locale en_AU
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1521)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1260)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:715)
at com.mysql.jdbc.Messages.<clinit>(Messages.java:58)
... 9 more
Exception in thread "main" java.lang.NullPointerException
at com.radiobusi.ShoutGen.ShoutGen.main(Unknown Source)
我的 mysql 数据库语言环境在 solaris 上是 en_US,但我的 ubuntu mysql 数据库也是 en_US。
有人有任何想法吗?
我不确定还需要什么其他信息,因此如果您想要更多信息,请在评论中告诉我。
包装好的罐子
junit-4.8.1.jar
libshout.jar
log4j-1.2.15.jar
mysql-5.1.6.jar
munderwo@opensolaris:~/ShoutGen-Java$ uname -a
SunOS opensolaris 5.11 snv_111b i86pc i386 i86pc Solaris
MySQL 版本:MySQL 5.1.30
干杯
标记
PS 这是来自https://stackoverflow.com/questions/2036507/building-a-jar-with-mysql-jdbc-on-solaris因为它模糊了编程和系统管理之间的界限。
更新 1:
以下 ant 目标是我打包 jar 的方式。这意味着 mysql jar 实际上位于 jar 内,应该可以自动获取
<target name="jar">
<!-- Capture the path as a delimited property using the refid attribute -->
<property name="myclasspath" refid="classpath"/>
<!-- Emit the property to the ant console -->
<echo message="Classpath = ${myclasspath}"/>
<mkdir dir="${jar.dir}"/>
<jar destfile="${dest.file}" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="com.radiobusi.ShoutGen.ShoutGen"/>
</manifest>
<zipfileset src="${lib.dir}/junit-4.8.1.jar" includes="**/*.class"/>
<zipfileset src="${lib.dir}/libshout.jar" includes="**/*.class"/>
<zipfileset src="${lib.dir}/log4j-1.2.15.jar" includes="**/*.class"/>
<zipfileset src="${lib.dir}/mysql-5.1.6.jar" includes="**/*.class"/>
</jar>
</target>
答案1
确保您的 jar 正在使用 ubuntu 机器上打包的库。只需将文件系统中的库临时移动到其他位置即可。当您的 jar 运行时,您可以确保使用 jar 中的库。
您是如何从 jar 中引用外部库的?您是否将它们添加到清单文件的 Class-Path 中?当您这样做时,您使用的是相对路径还是绝对路径?
答案2
我认为造成这种意外、惊喜的原因是用户错误:)
我从源代码中的 lib 目录中删除了所有 mysql jdbc,然后将 opensolaris 附带的 mysql jdbc 连接器(看起来来自 sun studio)放在 java 的 lib/ext 中。一旦我这样做,一切似乎都起作用了。仔细检查后,我认为我的类路径中可能仍有 ubuntu mysql JDBC 驱动程序,而且很可能在跨平台 jar 之前。所以我怀疑这就是问题所在。
感谢你的帮助!
标记。