class.forname(“com.mysql.jdbc.driver”)没有在jar文件中查找该类

798qvoo8  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(359)

我对java非常陌生,而且学习速度很快。我有一个遗留的coldfusion10应用程序,我希望以增量方式使用java类,而不是coldfusioncfcs,以此来迁移出cfland。到目前为止,我已经写好的课程都能用上。
我现在要测试如何使用cf使用的相同java连接器(在本例中是mysql-connector-java-commercial-5.1.25-bin.jar,在localhost dev机器上使用)与mysql数据库交互。
为了简化测试,我的测试类和连接器jar都在同一个文件夹(windows机器)中。
问题在于这种说法: Class.forName("com.mysql.jdbc.Driver"); -我要走了 Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver .
现在,如果我解压缩连接器jar,使文件夹出现在我的测试文件夹中: com\mysql\jdbc\Driver.class (以及jar中的所有其他文件),我的测试类工作正常,记录被插入到db表中。酷!
但是,如果我删除实际的文件夹并依赖于jar本身,那就是当我得到classnotfoundexception时。
在我的其他学习/测试(使用我自己生成的jar文件)中,一个相关的类被从jar中提取出来。但是对于这个mysql测试的特定jar,情况并非如此。
我应该注意什么-显然我错过了什么?
谢谢。我真的很期待搬进 java 岛
默里

yqyhoc1h

yqyhoc1h1#

仅将jar文件放在当前目录中是不够的。您必须告诉java将mysql jar文件包含在 classpath . 这可以通过在java命令行上用 -cp 参数,或 CLASSPATH 环境变量。

0s7z1bwu

0s7z1bwu2#

我使用postgres&h2而不是mysql。所以我不知道你对mysql有什么问题。但我刚刚能够用运行时提供的mysql驱动程序创建一个新项目。继续读下去,以我为榜样。

maven驱动的项目示例

现在的java项目通常由依赖关系管理和构建自动化工具(如maven、gradle或ivy)管理。
我使用maven快速启动原型启动了一个新的java项目。
在该原型提供的pom文件中,我做了两个更改:
更改了 <maven.compiler.source> & <maven.compiler.target>1.711 使用java11,目前长期支持的版本。
添加了一个与您提到的jdbc驱动程序相似的依赖项:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

然后我在 App '类' main 方法。

try
        {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Found class for JDBC driver.");
        }
        catch ( ClassNotFoundException e )
        {
            e.printStackTrace();
        }
        System.out.println( "Hello World!" );

当我运行这个时,没有抛出异常。所以这个班似乎找到了。
完成pom:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns = "http://maven.apache.org/POM/4.0.0"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>work.basil.example</groupId>
    <artifactId>jdbc-driver-in-jar</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>jdbc-driver-in-jar</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

完整应用程序类:

package work.basil.example;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Found class for JDBC driver.");
        }
        catch ( ClassNotFoundException e )
        {
            e.printStackTrace();
        }
        System.out.println( "Hello World!" );
    }
}

注意事项:
我在控制台输出中注意到,特定的jdbc驱动程序已经过时了。您应该调查当前使用的正确的jdbc驱动程序。
装载等级 com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.driver'。驱动程序是通过spi自动注册的,通常不需要手动加载驱动程序类。 Class.forName 是加载jdbc驱动程序的老式方法,不再需要。jdbc驱动程序加载在几年前有了很大的改进。今天的jdbc驱动程序是通过java的服务提供者接口(spi)工具加载的。但是那 Class.forName 代码对于探索您的这个问题仍然有用,可以验证类是否可以在类路径上找到。
通常最好使用 DataSource 用于获取数据库连接。您的jdbc驱动程序可能提供了 DataSource . 此类将保存连接到数据库服务器所需的信息,例如查找数据库服务器的地址,以及通过数据库服务器进行身份验证的用户名和密码。

1bqhqjot

1bqhqjot3#

好 啊。感谢您的快速、有用和有趣的输入!:-)
两件事:
运行使用 java 来自@schtever works的回答: java -classpath .;mysql-connector-java-commercial-5.1.25-bin.jar MySQLAccessMain . 我不知道那件事 .; 语法。谢谢您。
因为我最终将在coldfusion上下文中执行这个类(至少现在是这样),下面的cfm可以工作,因为,当然,coldfusion处理到它的jar堆的类路径。
这是java测试类

public class MySQLAccessMain {
  public static void main(String[] args) throws Exception {
    MySQLAccess dao = new MySQLAccess();
    dao.readDataBase(); // Run some fixed SELECT and INSERT tests
  }
}

这是cfm版本

var dao = createObject("java","MySQLAccess");
dao.readDataBase();

当然在应用中。cfc:

this.javaSettings = {
    loadPaths: [
        "/myjava"  // Where MySQLAccess.class goes
    ]
    ,loadColdFusionClassPath: true // If this is true you can also use the coldfusion builtin java classes
    ,reloadOnChange = true
    ,watchInterval = 2
};

:-)快乐露营者!再次感谢。

相关问题