针对在pom中添加selenium依赖项后,AWSLambdaJar无法压缩和pom添加依赖报错这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展AWSLambdaJava:Lambda无法解
针对在pom中添加selenium依赖项后,AWS Lambda Jar无法压缩和pom添加依赖报错这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展AWS Lambda Java:Lambda无法解压缩文件、AWS Lambda-无法导入模块lambda函数、AWS Lambda-无法导入模块“ lambda_function”、AWS lambda的aws-lambda-node_module错误,依赖关系的最佳实践是什么?等相关知识,希望可以帮助到你。
本文目录一览:- 在pom中添加selenium依赖项后,AWS Lambda Jar无法压缩(pom添加依赖报错)
- AWS Lambda Java:Lambda无法解压缩文件
- AWS Lambda-无法导入模块lambda函数
- AWS Lambda-无法导入模块“ lambda_function”
- AWS lambda的aws-lambda-node_module错误,依赖关系的最佳实践是什么?
在pom中添加selenium依赖项后,AWS Lambda Jar无法压缩(pom添加依赖报错)
这是一个奇怪的错误。将selenium依赖项添加到我的maven项目的pom中并将其上传到lambda之后,它说无法解压缩文件。但是,在删除依赖项之后,lambda可以很好地解压缩文件(但是它附带了后来找不到的类)。我尝试过一个接一个地删除依赖项,但是每一个都会触发错误。
关于如何解决这个问题的任何想法?
找不到类错误
org/openqa/selenium/WebDriver: java.lang.NoClassDefFoundErrorjava.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver
Lambda无法压缩错误
Calling the invoke API action failed with this message: Lambda was not able to unzip the file
导致问题的依赖项
<dependency> <groupId>org.seleniumhq.webdriver</groupId> <artifactId>webdriver-common</artifactId> <version>0.9.7376</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
更新的依赖关系(对于Vishal)
<dependency> <groupId>org.seleniumhq.webdriver</groupId> <artifactId>webdriver-common</artifactId> <version>0.9.7376</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-api</artifactId> <version>2.0rc2</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-remote-driver</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-support</artifactId> <version>3.141.59</version> </dependency>
组态
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <forceJavacCompilerUse>true</forceJavacCompilerUse> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
答案1
小编典典阴影插件将所有依赖项与开发的代码结合在一起,并在一个Uber
JAR中对其进行加密。缺点是它可以覆盖资源文件,并且不能与签名的jar一起很好地使用(至少以我的经验)。
如果可能的话,我建议远离阴影插件。
就是说,如果您必须使用它-您可能会遇到合并jar资源的问题。您可以使用许多变压器来解决此问题,并且您需要研究确实需要哪一个。我将从这样的事情开始
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <configuration> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>${executable.classifier}</shadedClassifierName> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>fully.qualified.ClassName</mainClass> </transformer> </transformers> </configuration> </execution> </executions></plugin>
你可以找到关于Apache更发电产品的插件这里
我建议的替代方法是Spring Boot,它使用Jar-in-Jar结构和自定义ClassLoader来从内部jar中加载类。
由于不必像Shade插件方法那样重写文件,因此这是一种更简单的方法,它可以更好地处理依赖项。
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.6.RELEASE</version> <configuration> <classifier>${executable.classifier}</classifier> <layout>ZIP</layout> <mainClass>fully.qualified.ClassName</mainClass> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions></plugin>
认真地看一下简单的配置!
注意:大部分内容来自我自己的注释-版本号可能有点旧…
AWS Lambda Java:Lambda无法解压缩文件
我正在尝试将Java与AWS Lambda结合使用。我创建了一个具有所有依赖项的jar文件(使用maven-assembly-
plugin)。上传后,我无法调用lambda。我收到错误消息Calling the Invoke API failed with message:Lambda was not able to unzip the file
。jar文件为11 MB。我可以用java -jar
答案1
小编典典maven-assemply-plugin
需要被告知输出a zip
而不是a jar
。(我什至不知道有什么区别!)
将此添加到其配置中:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> ... <configuration> ... <formats> <format>zip</format> </formats> </configuration></plugin>
AWS Lambda-无法导入模块lambda函数
如何解决AWS Lambda-无法导入模块lambda函数?
我正在尝试编写一个简单的Lambda函数来连接和执行aurora MysqL数据库操作。
函数的名称为LogStream
,Python文件为lambda_function.py
,其中有我的handler function
。
我已经从CLI更新了处理程序,并成功完成了
{
"FunctionName": "LogStream","FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxx:function:LogStream","Runtime": "python3.6","Role": "arn:aws:iam::xxxxxxx:role/LambdaRole","Handler": "lambda_function.handler","CodeSize": 777,"Description": "","Timeout": 3,"MemorySize": 128,"LastModified": "2020-10-14T16:26:20.733+0000","CodeSha256": "gEM+bUdubHBGiwPecUv+IT0QEBzR28Ave94F8hc=","Version": "$LATEST","TracingConfig": {
"Mode": "Passthrough"
},"RevisionId": "7403730c-5349-4766-a11f-c68d66420a4a","Layers": [
{
"Arn": "arn:aws:lambda:us-east-1:xxxxxx:layer:pyMysqL:1","CodeSize": 1621906
}
],"State": "Active","LastUpdateStatus": "Successful"
}
这是完整的代码:
import sys
import logging
import rds_config
import pyMysqL
#rds settings
rds_host = "aurora-MysqL-instance-1.xxxxxx.us-east-1.rds.amazonaws.com"
name = "admin"
password = "xxxxxx"
db_name = "Test"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
conn = pyMysqL.connect(rds_host,user=name,passwd=password,db=db_name,connect_timeout=5)
except pyMysqL.MysqLError as e:
logger.error("ERROR: Unexpected error: Could not connect to MysqL instance.")
logger.error(e)
sys.exit()
logger.info("SUCCESS: Connection to RDS MysqL instance succeeded")
def handler(event,context):
"""
This function fetches content from MysqL RDS instance
"""
item_count = 0
with conn.cursor() as cur:
cur.execute("create table Employee ( EmpID int NOT NULL,Name varchar(255) NOT NULL,PRIMARY KEY (EmpID))")
cur.execute(''insert into Employee (EmpID,Name) values(1,"Joe")'')
cur.execute(''insert into Employee (EmpID,Name) values(2,"Bob")'')
cur.execute(''insert into Employee (EmpID,Name) values(3,"Mary")'')
conn.commit()
cur.execute("select * from Employee")
for row in cur:
item_count += 1
logger.info(row)
#print(row)
conn.commit()
return "Added %d items from RDS MysqL table" %(item_count)
我添加了一个Layer
依赖项的pyMysqL
。
我无法弄清为什么调用失败并出现错误:
{"errorMessage": "Unable to import module ''lambda_function''"}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
AWS Lambda-无法导入模块“ lambda_function”
像我之前的许多其他人一样,我正在尝试运行一个AWS Lambda函数,当我尝试对其进行测试时,
“ errorMessage”:“无法导入模块’lambda_function’”
我的处理程序设置为lambda_function.lambda_handler,我确实有一个名为lambda_function.py的文件,其中包含一个名为lambda_handler的函数。这是屏幕截图作为证明:
当我在随附的IDE中内联编写代码片段时,一切工作正常,但是当我将完整程序及其所有依赖项压缩并上传后,出现上述错误。
我正在使用Numpy和Scipy程序包,它们非常大。我的压缩目录为34 MB,未压缩的目录为122 MB。我认为这应该没问题,因为压缩目录的限制为50
MB。似乎上传正常,因为我看到以下消息:
Lambda函数“单镜头图像分类”的部署包太大,无法启用内联代码编辑。但是,您仍然可以立即调用函数。
我已经看到一些帖子通过使用virtualenv解决了这个问题,但是我对这种技术并不熟悉,我不确定如何正确使用它。
我也看到一些帖子说,有时依赖项具有依赖项,我可能需要包括这些依赖项,但是我不确定如何找到它。
这是lambda_function.py的顶部,应该足以查看我正在使用的库,并且确实具有lambda_handler函数:
import os
import boto3
import numpy as np
from scipy.ndimage import imread
from scipy.spatial.distance import cdist
def lambda_handler(event,context):
s3 = boto3.resource('s3')
这是我要上传的目录的未压缩版本的屏幕截图:
如果这可能是一个问题,我还可以发布Lambda使用的策略角色。
非常感谢任何见解!
更新:
这是我尝试的一种解决方案:1. git clone https://github.com/Miserlou/lambda-packages
2.在Documents中创建一个名为new_lambda的文件夹3.将我的lambda_function.py和numpy文件夹从lambda软件包复制到new_lambda中,以及我使用Docker
for AWS编译的scipy库文章:https : //serverlesscode.com/post/scikitlearn-with-amazon-
linux-container/ 4.右键单击new_lambda文件夹并选择“ compress”压缩它
我的结果:
无法导入模块“ lambda_function”:没有名为“ lambda_function”的模块
重申一下,我的文件名为lambda_function.py,并包含一个名为lambda_handler的函数,该函数接受两个参数(如上所示)。此信息与在Handler中看到的信息相同,也与上面看到的信息相同。
如果这很重要,我正在使用Mac计算机。
更新2
如果我按照上述步骤操作,而是直接选择要压缩的文件来压缩文件,然后右键单击并选择“压缩”,则会出现错误
无法导入模块“ lambda_function”:无法导入名称“ show_config”
另外,预编译的lambda软件包表示它们是为“至少Python 2.7”编译的,但是我的lambda运行时是3.6。这可能是个问题吗?
AWS lambda的aws-lambda-node_module错误,依赖关系的最佳实践是什么?
例如,我有一个需要sequelize和convict的项目,并且一直在收到错误,说它无法找到moment模块作为子依赖项.我看到那个时刻包含在我的node_modules的根目录中,但它没有包含在sequelize模块下的子文件夹中.
但是,这个项目在当地运行良好. lambda有什么区别,用它来部署一些有点长的节点模块的最佳实践是什么 – 只是node_modules文件夹的一个副本?在我所拥有的一些其他更简单的项目中,可以复制少量的node_modules而没有任何问题.
{ "errorMessage": "Cannot find module ''moment''","errorType": "Error","stackTrace": [ "Function.Module._resolveFilename (module.js:338:15)","Function.Module._load (module.js:280:25)","Module.require (module.js:364:17)","require (module.js:380:17)","VERSION (/var/task/node_modules/sequelize/node_modules/moment-timezone/moment-timezone.js:14:28)","Object. (/var/task/node_modules/sequelize/node_modules/moment-timezone/moment-timezone.js:18:2)","Module._compile (module.js:456:26)","Object.Module._extensions..js (module.js:474:10)","Module.load (module.js:356:32)","Function.Module._load (module.js:312:12)" ] }
解决方法
您可以在本地计算机上创建项目并进行所需的所有更改,然后您要压缩的文件应该具有相同的结构,并且还可以看到有一个选项可以从zip文件加载代码.
今天关于在pom中添加selenium依赖项后,AWS Lambda Jar无法压缩和pom添加依赖报错的介绍到此结束,谢谢您的阅读,有关AWS Lambda Java:Lambda无法解压缩文件、AWS Lambda-无法导入模块lambda函数、AWS Lambda-无法导入模块“ lambda_function”、AWS lambda的aws-lambda-node_module错误,依赖关系的最佳实践是什么?等更多相关知识的信息可以在本站进行查询。
本文标签: