在 Solaris 上使用 MySQL jdbc 构建 jar

在 Solaris 上使用 MySQL jdbc 构建 jar

我正在构建一个使用 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 之前。所以我怀疑这就是问题所在。

感谢你的帮助!

标记。

相关内容