文档章节

VB.NET 自动打包程序

北风其凉
 北风其凉
发布于 2015/10/14 22:39
字数 2588
阅读 504
收藏 2
点赞 0
评论 0

因为每次将编译好的程序提交时都要花费很多时间用来打包,因此我需要有一个让程序自动完成这些琐碎的工作。

首先说一下我的目标。我的C#程序(在本文中暂时称作Example.exe)编译后暂时存放在Debug目录中,该程序有两种形态:平台端和客户端,它们分别给不同的用户使用,这两个客户端的不同之处仅在与App.config(可以被看做一个XML文件)中的配置不同。打包时需要先使用NSIS脚本对Debug目录下的内容制作成安装包,再使用WinRAR将安装包进行压缩。除了两个安装包外,还需要提供一些文件放置到自动更新的目录下,这些文件需要单独打成安装包。

为此我使用VB.NET写了一个小程序(暂时取名叫SoftwareRelease),来实现这个功能。

配置文件如下:

<?xml version="1.0" encoding="gb2312"?>
<!--SoftwareRelease配置文件-->
<Config Software="SoftwareRelease">
  <!--Debug目录地址-->
  <DebugDir>D:\Example\bin\Debug</DebugDir>
  <!--打包完毕后软件包所在目录地址-->
  <ObjectDir>D:\ObjectPath</ObjectDir>
  <!--编译器路径 注意用 makensis.exe 而不是 makensisw.exe -->
  <CompilerPath>D:\NSIS\makensis.exe</CompilerPath>
  <!--"RAR压缩工具路径-->
  <WinRARPath>D:\WinRAR\rar.exe</WinRARPath>
  <!--编译脚本路径-->
  <ScriptList>
    <Script Name="platform" 
            Directory="D:\PackageTools\打包脚本" 
            Script="Platform.nsi" />
    <Script Name="client" 
            Directory="D:\PackageTools\打包脚本" 
            Script="Client.nsi" />
  </ScriptList>
</Config>

将这个文件放置在编译好的EXE文件相同路径下即可。

因为程序中要使用WinRAR和NSIS编译工具,因此在配置文件中要写明这两个程序可执行文件的绝对路径。

程序代码如下:

Imports System.Xml
Imports System.IO

''' <summary>
''' SoftwareRelease 软件自动打包工具
''' </summary>
''' <remarks></remarks>
Module ModuleMain

    ''' <summary>
    ''' SoftwareRelease 软件自动打包工具
    ''' </summary>
    ''' <remarks></remarks>
    Sub Main()

        '设置控制台缓冲区大小
        Console.BufferHeight = 5000
        '控制台文字颜色 - 青色
        Console.ForegroundColor = ConsoleColor.Cyan
        '程序使用的标准时间
        Dim dateTimeUni As DateTime = DateTime.Now

        Console.WriteLine("SoftwareRelease 软件自动打包工具")
        Console.WriteLine("版本号:" & System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())
        Console.WriteLine(New String("=", 20))
        Console.WriteLine(dateTimeUni.ToString)
        Console.WriteLine()

        ' ----------- 1、读入参数即相关准备工作 ----------- '
        Dim Args As String() = System.Environment.GetCommandLineArgs()

        Dim bNeedPlatform As Boolean = False '打包平台端
        Dim bNeedClient As Boolean = False '打包客户端
        Dim bNeedUpdate As Boolean = False '打包自动更新文件

        '分析传入参数
        If Args.Contains("/?") Or Args.Length = 1 Then '查看帮助
            PrintUsage()
            Pause()
            Exit Sub
        ElseIf Args.Contains("/A") Or Args.Contains("/a") Then '全量包
            bNeedPlatform = True
            bNeedClient = True
            bNeedUpdate = True
        Else
            If Args.Contains("/P") Or Args.Contains("/p") Then '打包平台端
                bNeedPlatform = True
            End If
            If Args.Contains("/C") Or Args.Contains("/c") Then '打包客户端
                bNeedClient = True
            End If
            If Args.Contains("/U") Or Args.Contains("/u") Then '打包自动更新文件
                bNeedUpdate = True
            End If
        End If

        Console.WriteLine("本次执行任务:")
        If bNeedPlatform Then
            Console.WriteLine("打包平台端")
        End If
        If bNeedClient Then
            Console.WriteLine("打包客户端")
        End If
        If bNeedUpdate Then
            Console.WriteLine("打包自动更新文件")
        End If
        Console.WriteLine()

        '编译完毕后程序目录地址
        Dim debugDir As String = ""
        '打包完毕后软件包所在目录地址
        Dim objectDir As String = ""
        '编译器路径
        Dim compilerPath As String = ""
        'WinRAR压缩工具路径
        Dim winRARPath As String = ""
        '编译脚本所在目录:平台端
        Dim scriptDirOfPlatform As String = ""
        '编译脚本名称:平台端
        Dim scriptFileOfPlatform As String = ""
        '编译脚本所在目录:客户端
        Dim scriptDirOfClient As String = ""
        '编译脚本路径:客户端
        Dim scriptFileOfClient As String = ""

        '读取配置
        Console.WriteLine("正在读取配置...")
        Dim xmlDoc As XmlDocument = New XmlDocument()
        xmlDoc.Load("Config.xml")
        Dim xmlRoot As XmlNode = xmlDoc.SelectSingleNode("Config")

        For Each xmlObj In xmlRoot.ChildNodes
            If xmlObj.GetType().ToString() = "System.Xml.XmlElement" Then
                Dim xmlEle As XmlElement = DirectCast(xmlObj, XmlElement)
                Select Case xmlEle.Name
                    Case "DebugDir"
                        debugDir = xmlEle.InnerText.ToString.Trim
                        Console.WriteLine("编译完毕后程序目录地址:" & debugDir)
                    Case "ObjectDir"
                        objectDir = xmlEle.InnerText.ToString.Trim
                        Console.WriteLine("打包完毕后软件包所在目录地址:" & objectDir)
                    Case "CompilerPath"
                        compilerPath = xmlEle.InnerText.ToString.Trim
                        Console.WriteLine("编译器路径:" & compilerPath)
                    Case "WinRARPath"
                        winRARPath = xmlEle.InnerText.ToString.Trim
                        Console.WriteLine("WinRAR压缩工具路径:" & winRARPath)
                    Case "ScriptList"
                        For Each xmlObj2 In xmlEle.ChildNodes
                            If xmlObj2.GetType().ToString() = "System.Xml.XmlElement" Then
                                Dim xmlEle2 As XmlElement = DirectCast(xmlObj2, XmlElement)
                                If xmlEle2.Name = "Script" And xmlEle2.GetAttribute("Name") = "platform" Then
                                    scriptDirOfPlatform = xmlEle2.GetAttribute("Directory").ToString
                                    Console.WriteLine("编译脚本所在目录(平台端):" & scriptDirOfPlatform)
                                    scriptFileOfPlatform = xmlEle2.GetAttribute("Script").ToString
                                    Console.WriteLine("编译脚本名称(平台端):" & scriptFileOfPlatform)
                                End If
                                If xmlEle2.Name = "Script" And xmlEle2.GetAttribute("Name") = "client" Then
                                    scriptDirOfClient = xmlEle2.GetAttribute("Directory").ToString
                                    Console.WriteLine("编译脚本所在目录(客户端):" & scriptDirOfClient)
                                    scriptFileOfClient = xmlEle2.GetAttribute("Script").ToString
                                    Console.WriteLine("编译脚本名称(客户端):" & scriptFileOfClient)
                                End If
                            End If
                        Next
                    Case Else
                End Select
            End If
        Next

        '释放资源
        xmlDoc.RemoveAll()
        xmlDoc = Nothing

        '判断配置合法性
        Dim isConfigLegal As Boolean = True
        If String.IsNullOrWhiteSpace(debugDir) Then
            Console.WriteLine("编译完毕后程序目录地址缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(objectDir) Then
            Console.WriteLine("打包完毕后软件包所在目录地址缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(compilerPath) Then
            Console.WriteLine("编译器路径缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(winRARPath) Then
            Console.WriteLine("RAR压缩工具路径缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(scriptDirOfPlatform) Then
            Console.WriteLine("编译脚本所在目录(平台端)缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(scriptFileOfPlatform) Then
            Console.WriteLine("编译脚本名称(平台端)缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(scriptDirOfClient) Then
            Console.WriteLine("编译脚本所在目录(客户端)缺失")
            isConfigLegal = False
        End If
        If String.IsNullOrWhiteSpace(scriptFileOfClient) Then
            Console.WriteLine("编译脚本名称(客户端)缺失")
            isConfigLegal = False
        End If
        If Not isConfigLegal Then
            Pause()
            Exit Sub
        End If

        Console.WriteLine("配置读取完毕!")
        Console.WriteLine()

        ' ----------- 2、检查Debug目录 ----------- '
        If Not Directory.Exists(debugDir) Then
            Console.WriteLine("待打包程序目录不存在!")
            Pause()
            Exit Sub
        End If
        If Not File.Exists(debugDir + "\Example.exe") Then
            Console.WriteLine("待打包程序不存在!")
            Pause()
            Exit Sub
        End If
        If Not File.Exists(debugDir + "\Example.exe.config") Then
            Console.WriteLine("待打包程序关键配置文件缺失!")
            Pause()
            Exit Sub
        End If
        '清理掉所有pdb文件,这些文件是不需要的
        Console.WriteLine("正在清理PDB文件")
        DeleteAllPdb(New DirectoryInfo(debugDir))
        Console.WriteLine("正在清理登录信息")
        '清理登录信息,打包后的登录信息必须是干净的
        If File.Exists(debugDir + "\Config\LoginData.xml") Then
            'TODO:清理登陆信息
        End If
        Console.WriteLine("待打包程序目录检查完毕")
        Console.WriteLine()

        ' ----------- 3、将Debug目录中的程序配置成平台端 ----------- '
        If bNeedPlatform Or bNeedUpdate Then
            Console.WriteLine("将程序设置为平台端")
            If (SetAppConfig(debugDir + "\Example.exe.config", "platform")) Then
                Console.WriteLine("设置完毕")
                Console.WriteLine()
            Else
                Console.WriteLine("设置失败!")
                Pause()
                Exit Sub
            End If
        End If

        ' ----------- 4、复制一份,用于之后自动更新 ----------- '
        If bNeedUpdate Then
            If (Directory.Exists(objectDir & "\platform")) Then
                Console.WriteLine("目录【" & objectDir & "\platform】已存在,正在删除该目录")
                Directory.Delete(objectDir & "\platform", True)
                Console.WriteLine("删除完毕!")
            End If
            Console.WriteLine("正在复制文件到目录【" & objectDir & "\platform】")
            My.Computer.FileSystem.CopyDirectory(debugDir, objectDir & "\platform", True)
            Console.WriteLine("复制完毕!")
            Console.WriteLine("正在删除冗余文件")
            'TODO:删除冗余文件(即不用自动更新下来的文件)
            Console.WriteLine("冗余文件删除完毕!")
            Console.WriteLine()
        End If

        ' ----------- 5、为Debug目录中内容打包 ----------- '
        If bNeedPlatform Then

            Console.WriteLine("正在打包:平台端")
            Shell(compilerPath & " " & scriptDirOfPlatform & "\" & scriptFileOfPlatform)
            Console.WriteLine("平台端打包完毕")

            '压缩到RAR文件
            Dim packageName = scriptDirOfPlatform & "\平台端打包后文件.exe" '这里要做对应修改!
            If File.Exists(packageName) Then
                Dim rarName As String = dateTimeUni.ToString("yyyyMMdd") & "_PLATFORM.rar"
                'a表示压缩文件,-r表示递归,-ep表示忽略路径信息
                Shell(winRARPath & " a -ep " & objectDir & "\" & rarName & " " & packageName, AppWinStyle.NormalFocus, True)
            End If

        End If

        ' ----------- 6、将Debug目录中的程序配置成客户端 ----------- '
        If bNeedClient Or bNeedUpdate Then
            Console.WriteLine("将程序设置为客户端")
            If (SetAppConfig(debugDir + "\Example.exe.config", "client")) Then
                Console.WriteLine("设置完毕")
                Console.WriteLine()
            Else
                Console.WriteLine("设置失败!")
                Pause()
                Exit Sub
            End If
        End If

        ' ----------- 7、复制一份,用于之后自动更新 ----------- '
        If bNeedUpdate Then
            If (Directory.Exists(objectDir & "\client")) Then
                Console.WriteLine("目录【" & objectDir & "\client】已存在,正在删除该目录")
                Directory.Delete(objectDir & "\client", True)
                Console.WriteLine("删除完毕!")
            End If
            Console.WriteLine("正在复制文件到目录【" & objectDir & "\client】")
            My.Computer.FileSystem.CopyDirectory(debugDir, objectDir & "\client", True)
            Console.WriteLine("复制完毕!")
            Console.WriteLine("正在删除冗余文件")
            'TODO:删除冗余文件(即不用自动更新下来的文件)
            Console.WriteLine("冗余文件删除完毕!")
            Console.WriteLine()
        End If

        ' ----------- 8、为Debug目录中内容打包 ----------- '
        If bNeedClient Then

            Console.WriteLine("正在打包:客户端")
            Shell(compilerPath & " " & scriptDirOfClient & "\" & scriptFileOfClient)
            Console.WriteLine("客户端打包完毕")

            '压缩到RAR文件
            Dim packageName = scriptDirOfPlatform & "\客户端打包后文件.exe" '这里要做对应修改!
            If File.Exists(packageName) Then
                Dim rarName As String = dateTimeUni.ToString("yyyyMMdd") & "_CLIENT.rar"
                'a表示压缩文件,-r表示递归,-ep表示忽略路径信息
                Shell(winRARPath & " a -ep " & objectDir & "\" & rarName & " " & packageName, AppWinStyle.NormalFocus, True)
            End If

        End If

        ' ----------- 9、打包自动更新包 ----------- '
        If bNeedUpdate Then
            Dim rarNameUpdate As String = dateTimeUni.ToString("yyyyMMdd") & "_UPDATE.rar"
            'a表示压缩文件,-r表示递归,-ep1表示忽略被压缩的根文件夹
            Dim command As String =
                winRARPath & " a -r -ep1 " & objectDir & "\" & rarNameUpdate & " " &
                objectDir & "\platform" & " " & objectDir & "\client"
            Shell(command, AppWinStyle.NormalFocus, True)
        End If

        Console.WriteLine("打包工作全部完成!")

        Pause()

    End Sub

    ''' <summary>
    ''' 配置AppConfig中的客户端类型
    ''' </summary>
    ''' <param name="appConfigPath">AppConfig文件路径</param>
    ''' <param name="clientType">客户端类型字符串</param>
    ''' <returns>true:修改成功,false:修改失败</returns>
    ''' <remarks></remarks>
    Function SetAppConfig(appConfigPath As String, clientType As String)
        Dim xmlAppConfig As XmlDocument = New XmlDocument
        xmlAppConfig.Load(appConfigPath)
        Dim xmlRoot As XmlNode = xmlAppConfig.SelectSingleNode("configuration")
        'TODO:更改App.config中配置,更改成功则 GoTo 到 END_CONFIG
        Return False
END_CONFIG:
        xmlAppConfig.Save(appConfigPath)
        xmlAppConfig.RemoveAll()
        xmlAppConfig = Nothing
        Return True
    End Function

    ''' <summary>
    ''' 删除所有PDB文件
    ''' </summary>
    ''' <param name="dif"></param>
    ''' <remarks></remarks>
    Private Sub DeleteAllPdb(dif As DirectoryInfo)
        '遍历各个子文件夹
        For Each di As IO.DirectoryInfo In dif.GetDirectories
            DeleteAllPdb(di)
        Next
        For Each f As System.IO.FileInfo In dif.GetFiles
            If f.Extension.ToLower = ".pdb" Then
                f.Delete()
            End If
        Next
    End Sub

    ''' <summary>
    ''' 打印程序用法
    ''' </summary>
    ''' <remarks></remarks>
    Sub PrintUsage()

        Dim Usage(7) As String
        Usage(0) = "程序使用方法"
        Usage(1) = "SoftwareRelease [ /? | /p | /c | /u | /a ]"
        Usage(2) = "没有参数:显示帮助,这与键入 /? 是一样的"
        Usage(3) = "/p:打包平台端"
        Usage(4) = "/c:打包客户端"
        Usage(5) = "/u:打包自动更新包"
        Usage(6) = "/a:打包全部内容,相当于 /p /m /u 同时存在"
        Console.WriteLine(Join(Usage, vbCrLf))

    End Sub

    ''' <summary>
    ''' 按任意键继续
    ''' </summary>
    ''' <remarks></remarks>
    Sub Pause()

        Console.WriteLine("按任意键继续")
        System.Console.ReadKey()
        System.Console.Write(Chr(8) + " ") '删除按下的“任意键”字符

    End Sub

End Module

以上代码需要注意的方面有:

1、打包前要先删除冗余文件,如*.pdb文件。对于自动更新端,还要删除那些可能会随着每次登录发生改变的文件和目录(如本地缓存数据用的文件等)

2、WinRAR程序(rar.exe)和NSIS编译工具(makensis.exe)都提供了功能强大的命令,可以利用这些命令完成很多自动化操作内容。注意NSIS编译工具使用makensis.exe而不是makensisw.exe,后者是一个具备GUI的工具,前者是为命令行提供的工具。

3、本程序接收的命令行参数为 /p(打包平台端)、/c(打包客户端)、/u(打包自动更新)、/a(打包全部)和/?(帮助),如果无参数则默认显示帮助

4、控制台缓冲区大小要设置得大一些,否则Windows的控制台默认只支持保留最后的300行内容

5、为了更方便使用本程序,可以写一个bat脚本直接调用本程序。内容如下:

SoftwareRelease.exe /a

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 493
码字总数 462457
作品 4
朝阳
程序员
.net OCX 无法获取“****”控件的窗口句柄,不支持无窗口的ActiveX控 新解决方法

朋友找我帮原来的软件加一个小功能,程序是用VB.NET 写的。 软件需要与外部串口设备通信,一只带串口功能的压力表。 应该时间周期很急,所以串口部分我就直接用厂家提供的VB DEMO 写了个OCX...

曹梦龙 ⋅ 2015/06/27 ⋅ 0

Tosobright/MATP

MATP 1.《SplashScreen》MATP的引导是以VB6.0进行编写,VB6.0开发的引导界面,主要是小巧,可以快速启动 2.《LVMain》LabVIEW为测试主体语言,LVMain中的MyLib为个人积累的库文件,界面可缩放...

Tosobright ⋅ 2017/01/14 ⋅ 0

批处理脚本:自动从SVN上更新代码并编译C#程序

之前写过一篇文章,是关于一个用VB.NET写的版本发布工具的,地址如下: http://my.oschina.net/Tsybius2014/blog/517298 使用该工具可以将Debug目录中编译好的程序打成安装包,并选出用于自动...

北风其凉 ⋅ 2016/06/22 ⋅ 0

总结下开发C#客户端应用程序需要注意的一些问题

本文是我前几天给公司里面同事培训C#时的一个讲义,今天抽时间进行了下润色,主要介绍了下我这几年开发C#应用程序积累的一些经验。虽然本文围绕着C#语言展开,但大部分场景同样也适用于VB.NE...

北风其凉 ⋅ 2016/03/09 ⋅ 2

ArcGIS for Windows Mobile 10.1更名,并将在四月进行全面测试

ArcGIS for Windows Mobile 10.1更名为ArcGIS for Windows Mobile 3.0 Esri移动组成员邀请大家于4月16-20号 在Redlands California对ArcGIS for Windows Mobile 3.0(以前为ArcGIS Mobile 1......

长平狐 ⋅ 2012/11/28 ⋅ 2

与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]

前一阵子写了不少关于代码生成相关的文章,介绍了一些如何通过VS自动生成代码的解决方案,比如CodeDOM、T4以及ASP.NET的BuildProvider等。现在将它们作一个汇总,给广大读者作一个参考。 [第...

长平狐 ⋅ 2012/09/04 ⋅ 0

ReSharper Ultimate 2016.3 RTM 版发布

ReSharper Ultimate 2016.3 RTM 版发布了,ReSharper 是一款由 jetbrains 开发的针对C#, VB.NET, ASP.NET, XML, 和 XAML 的编辑器。沿袭了 jetbrains 开发工具一贯的优良传统,ReSharper 拥有...

王练 ⋅ 2016/12/16 ⋅ 4

VB.NET / C# 如何获取程序当前路径

VB.NET / C# 如何获取程序当前路径 Forece Blog2017-08-219 阅读 编程VB.net 最近又重新回滚学习编程。每次都重头学,因为没做笔记。这回把所有需要的东西都直接写下来。以后就不用到处找资料...

Forece Blog ⋅ 2017/08/21 ⋅ 0

Python 各种扩展名(py, pyc, pyw, pyo, pyd)区别

扩展名 在写Python程序时我们常见的扩展名是py, pyc,其实还有其他几种扩展名。下面是几种扩展名的用法。 py py就是最基本的源码扩展名 pyw pyw是另一种源码扩展名,跟py唯一的区别是在windo...

u012234115 ⋅ 2017/10/10 ⋅ 0

VB.NET / C# 获取在线TXT文本文件内容并显示在TextBox上

VB.NET / C# 获取在线TXT文本文件内容并显示在TextBox上 Forece Blog2017-08-2220 阅读 c#VB.net文本文件txttextbox 目的:读取服务器上的文本文件,并将内容显示在 Textbox 文本框中 注:所...

Forece Blog ⋅ 2017/08/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 22分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 27分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 33分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 33分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 34分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 今天 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 今天 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部