同时生成的后缀为orignal的文件有什么作用
时间: 2024-04-01 09:31:25 浏览: 121
在 Maven 构建项目时,有时候会同时生成一个后缀为 `.original` 的文件,这个文件的作用是保存在执行 Maven 插件时修改了源文件的备份,以防止修改后的文件不符合预期而导致构建失败。
例如,在执行 `maven-compiler-plugin` 插件编译 Java 代码时,如果设置了 `forceJavacCompilerUse=true`,则会使用 `javac` 编译器而不是默认的 `ecj` 编译器。这时,如果编译过程中发生了错误,Maven 会将原始的 Java 源代码备份到一个后缀为 `.original` 的文件中,然后将生成的 `.class` 文件删除。这样可以确保在下一次构建时,重新编译源代码时使用的是正确的编译器,并且不会因为修改后的文件不符合预期而导致构建失败。
值得注意的是,这个 `.original` 文件不会被提交到版本控制系统中,它只是一个临时文件,仅用于帮助 Maven 插件正确地执行任务。
相关问题
katalon写一个Groovy脚本,利用java-diff-util库来实现两个文件夹的自动比较,并利用ReportGenerator将比较结果生成HTML。当文件在两个文件夹中都存在,但内容不一致,则将差异数据的行数及内容出力到html中,将具体哪个字段有差异高亮显示出来;当文件只在一个文件夹中存在,将信息输出到html中。要求能识别隔行数据,按文件名生成结果html,html里显示两个文件夹的差异内容
以下是一个可能的实现,其中假设你已经安装了Java-Diff-Utils和ReportGenerator:
```groovy
import difflib.*
import com.kms.katalon.core.reporting.ReportUtil
import com.kms.katalon.core.util.KeywordUtil
import java.nio.file.*
// 比较两个文件夹的内容
def compareFolders(String folder1, String folder2) {
// 获取文件夹中的所有文件
def files1 = new File(folder1).listFiles()
def files2 = new File(folder2).listFiles()
// 遍历所有文件,分别比较
for (def file1 : files1) {
def file2 = new File(folder2, file1.getName())
if (file2.exists()) {
// 如果两个文件都存在,比较它们的内容
def lines1 = Files.readAllLines(file1.toPath())
def lines2 = Files.readAllLines(file2.toPath())
def patch = DiffUtils.diff(lines1, lines2)
if (!patch.getDeltas().isEmpty()) {
// 如果有差异,输出到HTML报告中
def reportFile = generateReport(file1.getName(), patch)
KeywordUtil.markWarning("文件 ${file1.getName()} 与 ${file2.getName()} 不同,详见报告 ${reportFile}")
}
} else {
// 如果只有一个文件存在,输出到HTML报告中
def reportFile = generateReport(file1.getName(), null, lines1)
KeywordUtil.markWarning("文件 ${file1.getName()} 只在 ${folder1} 中存在,详见报告 ${reportFile}")
}
}
// 找出只在第二个文件夹中存在的文件
def onlyInFolder2 = files2.findAll { !new File(folder1, it.getName()).exists() }
for (def file2 : onlyInFolder2) {
// 输出到HTML报告中
def reportFile = generateReport(file2.getName(), null, null, Files.readAllLines(file2.toPath()))
KeywordUtil.markWarning("文件 ${file2.getName()} 只在 ${folder2} 中存在,详见报告 ${reportFile}")
}
}
// 生成HTML报告
def generateReport(String fileName, Patch patch, List<String> originalLines = null, List<String> revisedLines = null) {
def reportFile = ReportUtil.generateReportFileName("diff_${fileName}")
def reportBuilder = new StringBuilder()
// 输出文件名
reportBuilder.append("<h1>文件 ${fileName}</h1>")
if (patch != null) {
// 输出差异内容
reportBuilder.append("<h2>差异行数:${patch.getDeltas().size()}</h2>")
reportBuilder.append("<table>")
reportBuilder.append("<tr><th>原文件</th><th>新文件</th></tr>")
for (def delta : patch.getDeltas()) {
def originalStart = delta.getOriginal().getPosition() + 1
def originalEnd = originalStart + delta.getOriginal().size() - 1
def revisedStart = delta.getRevised().getPosition() + 1
def revisedEnd = revisedStart + delta.getRevised().size() - 1
reportBuilder.append("<tr>")
reportBuilder.append("<td>${originalStart}-${originalEnd}</td>")
reportBuilder.append("<td>${revisedStart}-${revisedEnd}</td>")
reportBuilder.append("</tr>")
reportBuilder.append("<tr>")
reportBuilder.append("<td><pre>${highlight(originalLines.subList(originalStart - 1, originalEnd))}</pre></td>")
reportBuilder.append("<td><pre>${highlight(revisedLines.subList(revisedStart - 1, revisedEnd))}</pre></td>")
reportBuilder.append("</tr>")
}
reportBuilder.append("</table>")
} else {
// 输出只在一个文件夹中存在的文件信息
if (originalLines != null) {
reportBuilder.append("<h2>只在第一个文件夹中存在</h2>")
reportBuilder.append("<pre>${highlight(originalLines)}</pre>")
} else if (revisedLines != null) {
reportBuilder.append("<h2>只在第二个文件夹中存在</h2>")
reportBuilder.append("<pre>${highlight(revisedLines)}</pre>")
}
}
// 生成HTML报告
Files.write(Paths.get(reportFile), reportBuilder.toString().getBytes())
return reportFile
}
// 高亮显示差异内容
def highlight(List<String> lines) {
def result = new StringBuilder()
for (def line : lines) {
if (line.startsWith("+")) {
result.append("<span style=\"background-color:#aaffaa\">${line}</span>")
} else if (line.startsWith("-")) {
result.append("<span style=\"background-color:#ffaaaa\">${line}</span>")
} else {
result.append(line)
}
result.append("\n")
}
return result.toString()
}
// 示例用法
compareFolders("folder1", "folder2")
```
这个脚本假设你有两个文件夹,分别为“folder1”和“folder2”,并且它们都在你的Katalon工程目录下。你可以在脚本的最后一行调用`compareFolders`函数来比较这两个文件夹。比较结果将输出到Katalon的日志中,并生成HTML报告,报告文件名以“diff_”和文件名开头,后缀为“.html”。注意,这个脚本只比较文本文件,不会比较二进制文件。
import os.path import random import time from multiprocessing import Pool import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' } def get_img_src(page): ''' 抓取页面的图片的src :return: ''' for i in range(1, page+1): url = f'https://www.pkdoutu.com/photo/list/?page={i}' print(f'抓取{url}页数据') res = requests.get(url, headers=headers) res.encoding = res.apparent_encoding tree = etree.HTML(res.text) # 抓取图片 img_list = tree.xpath('//img[@referrerpolicy="no-referrer"]/@data-original') yield img_list def download_img(url): ''' 下载图片 :return: ''' time.sleep(random.uniform(0, 1)) img_res = requests.get(url, headers=headers) img_name = url.split('_')[-1] # 通过图片url进行拆分,拿到图片名称和后缀 path = 'img' # 判断路径是否存在,不存在则创建 if not os.path.exists(path): os.mkdir(path) # 写入到文件中 with open(os.path.join(path, img_name), 'wb') as f: f.write(img_res.content) if __name__ == '__main__': pool = Pool() # 通过生成器get_img_src返回图片列表 for url_list in get_img_src(2): for url in url_list: # 循环加入进程池 pool.apply_async(download_img, args=(url, )) pool.close() pool.join() print('over')
这是一个 Python 程序,主要用于从指定网站上抓取图片并下载到本地。程序使用了 multiprocessing 库中的进程池来实现多进程下载,加快了下载速度。其中,get_img_src 函数用于抓取指定页数的图片链接,download_img 函数用于下载指定链接的图片并保存到本地。主函数中使用了进程池来异步下载所有图片。
程序的具体实现步骤如下:
1. 导入所需的库,包括 os.path、random、time、multiprocessing 和 requests。
2. 定义抓取图片链接的函数 get_img_src,通过循环抓取指定页数的页面,并使用 lxml 库解析页面内容,抓取图片链接并返回。
3. 定义下载图片的函数 download_img,通过 requests 库下载指定链接的图片,并将图片保存到本地。
4. 在主函数中使用进程池来异步下载所有图片,具体实现如下:
a. 创建进程池 pool。
b. 通过生成器 get_img_src 返回图片链接列表,循环遍历每个链接。
c. 将 download_img 函数加入进程池,并传入图片链接作为参数。
d. 关闭进程池,并等待所有进程完成。
e. 打印下载完成提示信息。
该程序适用于需要大量下载图片的场景,可以通过调整进程池的大小和抓取的页数来适应不同的需求。
阅读全文