当前位置: 首页 > 知识库问答 >
问题:

在Visual Studio Code中部署Azure Function不包括. jar文件

鲜于峰
2023-03-14

我正在构建的Azure函数需要能够在AzureSQL服务器数据库中执行过程。

我有工作Java代码在Eclipse(基于@duffmo的答案在JavaDB连接)

然后,我将代码移植到Visual Studio Code中的Azure Function,以便部署到Azure。(注意我已删除安全代码等)我使用View/Command Palette/Azure Functions创建了项目-创建新项目

package com.function;

import java.sql.*;
import java.util.*;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpTrigger-Java". Two ways to invoke
     * it using "curl" command in bash: 1. curl -d "HTTP Body" {your
     * host}/api/HttpTrigger-Java&code={your function key} 2. curl "{your
     * host}/api/HttpTrigger-Java?name=HTTP%20Query&code={your function key}"
     * Function Key is not needed when running locally, it is used to invoke
     * function deployed to Azure. More details:
     * https://aka.ms/functions_authorization_keys
     */
    private static final String DEFAULT_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String DEFAULT_URL = "jdbc:sqlserver://myserver.database.windows.net:1433;database=mydb;loginTimeout=10;user=myuser@myserver;password=mypassword;";


    @FunctionName("HttpTrigger-Java")
    public HttpResponseMessage run(@HttpTrigger(name = "req", methods = { HttpMethod.GET,
            HttpMethod.POST }, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        Connection connection = null;
        try {

            connection = createConnection(DEFAULT_DRIVER, DEFAULT_URL,context);
            connection.setAutoCommit(false);
            String sqlUpdate = "{call MYDB.MYPROC(?,?}";
            List<Object> parameters = Arrays.asList("Bar", "Foo");
            execute(connection, sqlUpdate, parameters);
            connection.commit();

        } catch (Exception e) {
            rollback(connection);
            e.printStackTrace();
        } finally {
            close(connection);
        }
        return null;
    }

    public static Connection createConnection(String driver, String url, ExecutionContext context) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        return DriverManager.getConnection(url);
    }

    public static void close(Connection connection) {
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(Statement st) {
        try {
            if (st != null) {
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void rollback(Connection connection) {
        try {
            if (connection != null) {
                connection.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static double execute(Connection connection, String sql, List<Object> parameters) throws SQLException {
        CallableStatement call = connection.prepareCall(sql);
        try {
            int i = 0;
            for (Object parameter : parameters) {
                call.setObject(++i, parameter);
            }
            call.executeUpdate();

        } finally {
            close(call);
        }
        return 0;
    }
}

然而这条线

 Class.forName(driver);

导致以下错误

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.Class.forName0(Native Method)

我试图通过

>

  • sqljdbc4.jar放在lib目录中
  • 手动将以下内容添加到pom.xml

    <代码>

    试图通过从终端安装jar

    mvn install: install-file-Dfile='C:=myPath\myFunction\lib\sqljdbc4.jar'-DgroupId=包-DartifactId=sqljdbc4-Dversion='4.0'-D打包=jar

    尝试更改默认驱动程序字符串中“microsoft”和“sqlserver”的顺序。

    尝试从新的Java依赖项视图中添加SQLJDBC(请参见@hemangs answer)——但它不会出现在列表中

    我编辑了这本书。类路径根据@asndr在中的回答。类路径——请注意,我没有访问。在VS代码中创建类路径,而是通过文件资源管理器,然后运行view/Command palete/Java:Clean the Java language server workspace

    有什么想法吗?

  • 共有1个答案

    夹谷英杰
    2023-03-14

    基于@nirmal在失踪工件com中的回答。微软sqlserver:sqljdbc4:jar:4.0我做了以下工作:

    >

    <代码>

      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>mssql-jdbc</artifactId>
      <version>8.3.0.jre14-preview</version>
    </dependency>
    

    我把版本号改成了6.1.0。jre8(更高版本导致编译错误)

    似乎至关重要的是编辑pom。来自VS代码中的xml。似乎当我在VS代码之外编辑它时,VS代码并没有触发配置的同步。

     类似资料:
    • 问题内容: 我刚刚“继承”了一个Java项目,而不是来自Java背景,有时我会有点迷失。Eclipse用于在开发过程中调试和运行应用程序。我已经通过Eclipse成功创建了一个.jar文件,该文件“包含”了所有必需的外部jar,例如Log4J,xmlrpc- server等。然后可以使用以下命令成功运行此大.jar: 我的下一步是使用Ant(版本1.7.1)自动进行构建,因此我不必参与Eclips

    • 问题内容: 我正在向其中部署文件,并希望将其他文件包括到该段中,如下所述: 使用Heroku CLI配置WAR部署 它成功部署了文件,但是在扩展应用程序的任何子文件夹中我都找不到文件。同时,存档中的所有其他文件都在其位置上,其他 文件也仅此而已。我试图添加一些具有相同结果的文件: 问题: heroku在哪里包括其他文件?如何前往那里? 这是heroku-cli的输出: 问题答案: 这些文件将被添加

    • 我正在尝试编写一个ant目标,它将基于一堆java文件和一些属性文件创建一个jar,但在按照当前项目设置的方式包含属性文件时遇到了问题。 这些是我的蚂蚁目标: 1-从“myjar.src”文件夹编译java源文件,并将生成的类放入“myjar.classes”文件夹。完成后,复制所有非文件。java文件从“myjar.src”到“myjar.classes”。 2-使用basedir=${myja

    • 好的,这是我们得到的: 我们有两个库包,我们已经将它们编译成JAR。 我们用 而且 给我们装进罐子里。 现在我们想将这两个罐子包含到另一个Java项目中。 所以我们有 /project/src/a_pack/helloworld. /project/libs/starwars.jar /project/libs/barwars.jar /project/manifest.txt MANIFEST.

    • 我需要在weblogic server 10.3.6上部署非常旧的应用程序(10年-生病)。我有一个ear文件,其中包含几个带有EJB类的子部署jar(它们包含weblogic-EJB-jar.xml和EJB-jar.xml)。它通常部署在服务器上,我可以在weblogic中使用“查找”功能。 问题是,还有另一个没有ejb-jar.xml的jar(更旧)需要运行这个应用程序。例如,它有Object

    • 我正在尝试创建一个包含以下项目内容的jar文件 项目 user_interface(包文件夹,包括与GUI相关的所有.类) function_operations(包文件夹,包括与操作相关的所有.类) 声音(文件夹包括所有声音文件) 图标(包括所有图像和图标) jar(包括所有外部jar文件) manifest.txt(有一行*main-class:user_interface.messenger