如何在windows上安装部署设置linux部署svn服务器器

posts - 47,&
comments - 185,&
trackbacks - 0
&Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说.
首先来下载和搭建SVN服务器.
现在Subversion已经迁移到apache网站上了,下载地址:
这是二进制文件包的下载地址,你可在左侧的导航栏找到源代码,文档的下载地址.
windows操作系统下面的二进制文件包一共有5种,如图:
个人认为最好用VisualSVN server 服务端和 TortoiseSVN客户端搭配使用.
点开上面的VisualSVN连接,下载VisualSVN server,如图:
然后下载TortoiseSVN客户端,官网下载地址:
注意下载跟你电脑匹配的安装包,在页面的下面你还可以找到语言包,如图:
下载完成后,应该有这些安装包,如图:
&TortoiseSVN安装包和简体中文语言包
VisualSVN server安装包
先安装VisualSVN server的安装包,双击VisualSVN server安装包,如图:
点Next,进入下一步,如图:
点同意,进图下一步,如图:
选择上面一个选项,点Next,进入下一步,如图:
Location是指VisualSVN Server的安装目录,Repositorys是指定你的版本库目录.Server Port指定一个端口,Use secure connection勾山表示使用安全连接,Use Subversion authentication 表示使用Subversion自己的用户认证.点击Next,进入下一步,如图:
点Install,进入下一步,如图:
等待安装完成,如图:
安装完成后,启动VisualSVN Server Manager,如图:
接下来我们安装TortoiseSVN,双击安装包,进入下一步.如图:
点击Next,进入下一步,如图:
选择接受,然后点击Next,进入下一步,如图:
选择安装路径,然后点击Next,进入下一步,如图:
点击Install,开始安装,如图:
等待安装完成,安装完成后如图:
接下来我们安装简体中文语言包,这个非常简单,一路Next就行,就不截图了.语言包安装完成以后在桌面任意空白地方单击鼠标右键,会在右键菜单里找到SVN,如图:
选择设置,进入下一步,如图:
在右边的语言里面选择简体中文,然后点击应用,确定,汉化即完成,如图:
到这里,服务端和客户端都已经安装完毕,下一篇介绍用VisualSVN Server创建版本库,以及TortoiseSVN的使用.
阅读(...) 评论()windows装配基于Apache的SVN服务器(包括SSL配置)_[中转]maven配置文件的官方文档中文翻译_《项目心得》-简单三层使用DataTable向数据库表批量导入数据-向SqlServer多张张表中导入数据__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
windows装配基于Apache的SVN服务器(包括SSL配置)
[中转]maven配置文件的官方文档中文翻译
《项目心得》-简单三层使用DataTable向数据库表批量导入数据-向SqlServer多张张表中导入数据
windows装配基于Apache的SVN服务器(包括SSL配置)
windows安装基于Apache的SVN服务器(包括SSL配置)
1. 引言2. 安装过程2.1. 安装Apache2.2. 安装Subversion2.3. 配置2.4. 使用SSL来保护你的服务器摘要本文是TortoiseSVN1.3.5帮助中关于配置服务器一节的翻译,根据行文需要做了一些调整与增减。英文原文参见TortoiseSVN1.3.5帮助的3.1. Apache Based Server。要使用TortoiseSVN(或者其它的Subversion客户端),你要有一个存放版本库的地方。你可以将版本库存放在本机,使用file://协议来访问,也可以将它们放在一个服务器上,使用http://或svn://协议来访问。两种服务器协议(http://和svn://)也可以被加密成https://及svn+ssh://。下面将一步一步地为你展示如何在windows上配置这样一个服务器。如果你没有服务器或者你只想单独地工作,那么将版本库存放在本机并使用file://协议来访问是你最好的选择,这样的话,你可以略过本文。注:目前windows下的subversion有专门的for apache2.2.x版本,可以跟Apache2.2.x配合,不过本文所带的附件只在Apache2.0.x上测试过1. 引言在所有的Subversion服务器配置方式中,基于Apache的是最灵活的。虽然配置起来有一点点复杂,但是它提供了其它方式所没有的好处: WebDAV基于Apache配置的Subversion服务器使用了被许多其它程序支持的WebDAV协议。举个例子,你可以在Windows的资源管理器中将这样的一个版本库挂载成一个“Webfolder”,然后像文件系统中的其它文件夹一样访问它。浏览版本库你可以在不安装Subversion客户端的情况下,使用浏览器来浏览版本库中的内容。这将使得更大范围的用户可以访问你的数据。用户验证你可以使用任何Apache支持的验证机制,包括SSPI和LDAP。安全Apache是非常的稳定和安全,因此你的版本库自然而然地拥有同样的安全性。包括SSL加密。2. 安装过程2.1. 安装Apache安装Apache前,你要有一台运行Windows2000、Windows XP + sp1或Windows2003的电脑。警告:请注意,没安装Service Pack 1的Windows XP将导致错误的网络数据从而破坏你的版本库!从http://httpd.apache.org/download.cgi 最新版本的Apache Web服务器。确保你下载的版本大于2.0.54。2.0.54版本的Apache将不能与Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因为在windows上的编译存在一个bug而导致不能与subversion1.2配合使用。一旦你已经有了Apache2的安装程序,你可以双击它,它将引导你完成整个安装过程。请确保你输入正确的服务器URL(如果你的服务器没有DNS名称,你可以直接输入IP地址)。我建议你将Apache安装成 for all Users,on Port 80,as a service。注意:如果你已经有一个IIS或者其它的程序使用80端口,安装可能会失败。如果是这样,你可以到程序目录下的Apache Group\Apache2\conf目录中找到文件httpd.conf,将其中的Listen 80改成一个不用的端口,比如Listen 81。然后重新运行这个安装程序,这次应该不会再有问题了。现在你可以在你的浏览器中键入 http://loccalhost,如果呈现了一个已经配置好的网站,那么你的Apache就安装成功了。警告:如果你将Apache安装成一个服务,它将以本地system帐户来运行。为Apache创建一个单独的用户来运行它将会更安全一些。请确保运行Apache的用户有版本库的完全访问权限(右键版本库目录-&属性-&安全)。要不然,用户将无法提交他们的更改。就算Apache以本机system来运行,你也要设置它能完全读写版本库目录。如果没有为Apache配置这个许可,用户将会得到"禁止访问"的错误信息,在Apache的错误日志中表现为错误500。2.2. 安装Subversion从http://subversion.tigris.org/ser ... entList?folderID=91 (英文)或/forum-7-1.html(中文)下载最新版本的Subversion。运行Subversion安装程序,如果安装程序能够识别你已经安装了Apache,那么你的安装基本上就OK了。如果它不能,那么你要做一些额外的步骤。注:如果你先安装Apache,再安装Subversion,正常情况下下面的工作(2.3配置前)Subversion安装程序已经帮你完成了使用资源管理器,进入Sibversion的安装目录(通常为c:\program files\Subversion),找到文件httpd/mod_dav_svn.so和mod_authz_svn.so,将它们拷贝到Apache的modules目录(通常为c:\program files\apache group\apache2\modules)。从Subversion的安装目录拷贝文件libdb43.dll到Apache的modules目录。使用如记事本之类的文本编辑器编辑Apache的配置文件(通常为c:\program files\apache group\apache2\conf\httd.conf),修改以下内容:去掉以下行的注释(将开头的#删除): #LoadModule dav_fs_module modules/mod_dav_fs.so #LoadModule dav_module modules/mod_dav.so复制代码在LoadModule节的最后添加以下两行: LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so复制代码2.3. 配置现在,你已经安装了Apache和Subversion,但是Apache还不知道如果处理像TortoiseSVN一样的Subversion客户端。要让Apache知道哪个URL将被Subversion使用,你要像下面这样编辑Apache的配置文件(通常在c:\program files\apache group\apache2\conf\httpd.conf):在配置文件的最后添加下面这些行: &Location /svn&DAV svnSVNParentPath D:\SVN AuthType Basic AuthName "Subversion repositories" AuthUserFile D:\passwd #AuthzSVNAccessFile D:\svnaccessfile Require valid-user &/Location&复制代码这样配置表示:你所有的版本库将位于D:\SVN目录下,要访问你的版本库可以使用这样的URL:http://MyServer/svn/,访问权限将由passwd文件中的用户名/密码来限制。要创建passwd文件,可以打开命令行(DOS窗口),将当前目录切换到apache2目录(通常为c:\program files\apache group\apache2),然后打入以下命令以创建文件: bin\htpasswd -c passwd &username&复制代码此命令执行bin目录下的htpasswd.exe来创建一个密码文件,重启Apache服务。将你的浏览器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你之前创建的Subversion版本库)。如果一切正常,你将被提示输入用户名密码,输入正确的用户名密码后你就可以看到版本库中的内容了。对你刚刚输入的apache配置作一些简短的说明: &Location /svn&意味着可以通过像这样的URL(http://MyServer/svn)来访问Subversion版本库DAV svn告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块SVNListParentPath on在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库SVNParentPath D:\SVN告诉Subversion在目录D:\SVN下寻找版本库AuthType Basic启用基本的验证,比如用户名/密码对AuthName "Subversion repositories"当一个验证对话框弹出时,告诉用户这个验证是用来做什么的AuthUserFile D:\passwd指定D:\passwd用为密码文件用来验证用户的用户名及密码AuthzSVNAccessFile D:\svnaccessfile指定D:\svnaccessfile来限定各个用户或组在版本库中目录的访问权限Require valid-user限定用户只有输入正确的用户名及密码后才能访问这个路径----------------------------------------上面的配置仅仅是一个简单的示例。你还可以对Apache进行许许多多的配置。1如果你想让所有用户对版本库都有读的权限而只有特定的用户才有写的权限,你可以将这行 Require valid-user复制代码改为&LimitExcept GET PROPFIND OPTIONS REPORT&Require valid-user&/LimitExcept&复制代码2上面的配置使用了passwd文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制,如限定某个用户可以访问版本库中的哪个目录,可以把下面这行的#去掉: #AuthzSVNAccessFile D:\svnaccessfile复制代码然后用文本编辑器创建一个Subversion授权文件。Apache将确保只有有效的用户可以访问你的/svn位置,然后将用户名传到AuthzSVNAccessFile模块,这样可以依据Subversion授权文件得到更精细的权限控制。注意,路径将被指定为[库:路径]或者简单的[路径]。如果你不明确指定一个库,访问规则将应用到由SVNParentPath指定的目录下所有的版本库中。一个授权文件例子可能像这样: [groups]admin = john, katedevteam1 = john, rachel, sallydevteam2 = kate, peter, markdocs = bob, jane, miketraining = zak# 为所有库指定默认访问规则# 所有人可以读,管理员可以写,危险分子没有任何权限[/]* = r@admin = rwdangerman =# 允许开发人员可以完全访问他们的项目版本库[proj1:/]@devteam1 = rw[proj2:/]@devteam2 = rw[bigproj:/]@devteam1 = rw@devteam2 = rwtrevor = rw# 文档编写人员对所有的docs目录有写权限[/trunk/doc]@docs = rw# 培训人员可以完全访问培训版本库[TrainingRepos:/]@training = rw复制代码2.4. 使用SSL来保护你的服务器以上的工作已经可以让你的svn服务器正常工作了。如果你要更安全一些,可以配置ssl来保护你的服务器。因为美国出口限制,默认安装的Apache服务器不支持SSL。但是你自己可以很容易地在其它地方下载到所需要的模块,然后安装它。首先你需要SSL的必需文件。你可以/ 或这里找到相应的软件包(或者下载本主题的附件1:
mod_ssl_etc.rar (595.45 KB) 下载次数: 602006-10-16 15:30)。然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、conf/ssl.conf拷到conf目录。在Apache的conf目录中用文本编辑器打开ssl.conf。将下面这些行用#注释掉: DocumentRoot "c:/apache/htdocs"ServerName :443ServerAdmin [email][/email]ErrorLog logs/error_logTransferLog logs/access_log复制代码修改 SSLCertificateFile conf/ssl.crt/server.crt复制代码为 SSLCertificateFile conf/ssl/my-server.cert复制代码修改 SSLCertificateKeyFile conf/ssl.key/server.key复制代码为 SSLCertificateKeyFile conf/ssl/my-server.key复制代码修改 SSLMutex file:logs/ssl_mutex复制代码为 SSLMutex default复制代码删除以下两行(如果有): &IfDefine SSL&&/IfDefine&复制代码打开Apache配置文件(httpd.conf),去掉这行的注释 #LoadModule ssl_module modules/mod_ssl.so复制代码Openssl需要一个配置文件。你可以从这里下载一个可工作的版本http://tud.at/f (或者本主题附件2:
f.rar (1.21 KB) 下载次数: 312306-9-10 19:11)。将它保存到f。下面你要创建一个SSL证书。你可以打开一个命令行窗口,然后cd到Apache安装目录(比如C:\program files\apache group\apache2),敲入以下命令: bin\openssl req -config f -new -out my-server.csr复制代码你将被问及一句口令短语。请注意,不要使用简单的几个词,而应该输入一整个句子,比如一篇诗词的一部份,越长越好。同样,你还要输入你的服务器URL。然后其它的问题都是可选问答的,不过我建议你也将它们填充。下一步,敲入以下命令: bin\openssl rsa -in privkey.pem -out my-server.key复制代码以及(注意,只有一行) bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000复制代码这样将创建一个4000天后才过期的证书。最后敲入: bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER复制代码这些命令在Apache目录下创建了一些文件(my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert)。将这些文件拷贝到目录conf/ssl(比如C:\program files\apache group\apache2\conf\ssl),如果目录ssl不存在,你必须先创建一个。重启Apache服务。现在可以用类似这样的url来访问你的版本库了https://servername/svn/project 强制通过SSL来访问当你配置了SSL来提高版本库安全时,你可能想禁用无SSL的http访问方式,而只允许通过https访问。要达到这种效果,你要在&Location&块加入另外一个指示器SSLRequireSSL。一个示例&Location&块可能像这样:&Location /svn&DAV svnSVNParentPath D:\SVNSSLRequireSSLAuthType BasicAuthName "Subversion repositories"AuthUserFile passwd#AuthzSVNAccessFile svnaccessfileRequire valid-user&/Location&
[中转]maven配置文件的官方文档中文翻译
[转发]maven配置文件的官方文档中文翻译
简介:概览当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置。这包含了本地仓库位置,远程仓库服务器以及认证信息等。settings.xml存在于两个地方:1.安装的地方:$M2_HOME/conf/settings.xml2.用户的目录:${user.home}/.m2/settings.xml前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。如果你偶尔需要创建用户范围的settings,你可以简单的copy Maven安装路径下的settings到目录${user.home}/.m2。Maven默认的settings.xml是一个包含了注释和例子的模板,你可以快速的修改它来达到你的要求。下面是settings下的顶层元素的一个概览:
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&localRepository/&
&interactiveMode/&
&usePluginRegistry/&
&offline/&
&pluginGroups/&
&servers/&
&mirrors/&
&proxies/&
&profiles/&
&activeProfiles/&
&/settings&
settings的内容可以在下面这些地方篡改:1.${user.home}和所有其他的系统属性2.${env.HOME}等环境变量注意:settins.xml中profiles下定义的属性不能被篡改。配置细节:简单的值一半以上的顶级settings元素是简单的值,代表了一直处于活跃的构建系统的元素的取值范围。
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&localRepository&${user.home}/.m2/repository&/localRepository&
&interactiveMode&true&/interactiveMode&
&usePluginRegistry&false&/usePluginRegistry&
&offline&false&/offline&
&/settings&
localRepository:这个值是构建系统的本地仓库的路径。默认的值是${user.home}/.m2/repository.如果一个系统想让所有登陆的用户都用同一个本地仓库的话,这个值是极其有用的。interactiveMode:如果Maven要试图与用户交互来得到输入就设置为true,否则就设置为false,默认为true。usePluginRegistry:如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false。offline:如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。pluginGroups:这个元素包含了一系列pluginGroup元素,每个又包含了一个groupId。当一个plugin被使用,而它的groupId没有被提供的时候,这个列表将被搜索。这个列表自动的包含了org.apache.maven.plugins和org.codehaus.mojo。
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&pluginGroups&
&pluginGroup&org.mortbay.jetty&/pluginGroup&
&/pluginGroups&
&/settings&
例如,有了上面的配置,Maven命令行可以使用简单的命令执行org.morbay.jetty:jetty-maven-plugin:run,如下mvn jetty runservers:用来下载和部署的仓库是用POM中的repositories和distributionManagement元素来定义的。但是某些配置例如username和password就不应该随着pom.xml来分配了。这种类型的信息应该保存在构建服务器中的settings.xml中。
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&id&server001&/id&
&username&my_login&/username&
&password&my_password&/password&
&privateKey&${user.home}/.ssh/id_dsa&/privateKey&
&passphrase&some_passphrase&/passphrase&
&filePermissions&664&/filePermissions&
&directoryPermissions&775&/directoryPermissions&
&configuration&&/configuration&
&/servers&
&/settings&
id:这是Server的ID(不是登录进来的user),与Maven想要连接上的repository/mirror中的id元素相匹配。username,password:这两个元素成对出现,表示连接这个server需要验证username和password。privateKey,passphrase:与前两个元素一样,这两个成对出现,分别指向了一个私钥(默认的是${user.home}/.ssh/id_dsa)和一个passphrase。passphrase和password元素可能在将来被客观化,但是现在必须以文本形式在settings.xml中设置。filePermissions,directoryPermissions:当一个仓库文件或者目录在部署阶段被创建的时候,就必须用到权限许可。他们合法的值是三个数字,就像*nix中的文件权限,例如:664,775.注意:如果你使用了一个私钥来登录server,那么password元素必须被省略,否则私钥将被忽视。密码加密一个新特征:服务器password和passphrase加密已经被升到2.1.0+mirrors:
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&name&PlanetMirror Australia&/name&
&url&/pub/maven2&/url&
&mirrorOf&central&/mirrorOf&
&/mirrors&
&/settings&
id,name:唯一的镜像标识和用户友好的镜像名称。id被用来区分mirror元素,并且当连接时候被用来获得相应的证书。url:镜像基本的URL,构建系统敬将使用这个URL来连接仓库,而不是原来的仓库URL。mirrorOf:镜像所包含的仓库的Id。例如,指向Maven central仓库的镜像(http://repo1.maven.org/maven2/),设置这个元素为central。更多的高级映射例如repo1,repo2 或者*,!inhouse都是可以的。没必要一定和mirror的id相匹配。proxies:
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&id&myproxy&/id&
&active&true&/active&
&protocol&http&/protocol&
&host&&/host&
&port&8080&/port&
&username&proxyuser&/username&
&password&somepassword&/password&
&nonProxyHosts&*.|ibiblio.org&/nonProxyHosts&
&/proxies&
&/settings&
id:proxy的唯一标识,用来区别proxy元素。active:当proxy被激活的时候为true。当申明的代理很多的时候,这个很有用,但是同一时间仅有一个被激活。protocol,host,port:代理地址protocol://host:port的分散形式。username,password:两个元素成对出现,提供连接proxy服务器时的认证。nonProxyHosts:这里列出了不需要使用代理的hosts。列表的分隔符是proxy服务器想要的类型。上面例子使用了pipe分隔符,逗号分隔符也比较通用。配置文件settings.xml中的profile是pom.xml中的profile的简洁形式。它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。激活(activation)activations是profile的关键,就像POM中的profiles,profile的能力在于它在特定情况下可以修改一些值。而这些情况是通过activation来指定的。
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&profiles&
&id&test&/id&
&activation&
&activeByDefault&false&/activeByDefault&
&jdk&1.5&/jdk&
&name&Windows XP&/name&
&family&Windows&/family&
&arch&x86&/arch&
&version&5.1.2600&/version&
&property&
&name&mavenVersion&/name&
&value&2.0.3&/value&
&/property&
&exists&${basedir}/file2.properties&/exists&
&missing&${basedir}/file1.properties&/missing&
&/activation&
&/profile&
&/profiles&
&/settings&
如果所有指定的条件都达到了,那么,activation就被触发,而且不需要一次性全部达到。jdk:在jdk元素中,activation有一个内建的,java版本检测。如果检测到jdk版本与期待的一样,那么就激活。在上面的例子中,1.5.0_06是满足的。os:os元素可以定义一些上面所示的操作系统特定的属性。property:如果Maven检测到相应的名值对的属性,那么,这个profile将被激活。file:如果给定的文件存在,或者不存在那么将激活这个profile。activation并不是唯一激活profile的途径。settings.xml中的activeProfile包含了profile的id。他们也可以通过命令行来显式的激活,例如-P test。如果你想查看在一个构建过程中有哪些profile会被激活。就使用maven-help-pluginmvn help:active-profiles属性(properites)Maven的属性是值占位符,就像Ant中的属性。如果X是一个属性的话,那么它的值在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从settings.xml文件中访问到。1.env.X:使用“env.”前缀将会返回当前的环境变量。例如${env.PATH}就是使用了$path环境变量。2.project.X:一个点“.”分割的路径,在POM中就是相关的元素的值。例如:&project&&version&1.0&/version&&/project&就可以通过${project.version}来访问。3.settings.X:一个点“.”分割的路径,在settings.xml中就是相对应的元素的值,例如:&settings&&offline&false&/offline&&/settings&就可以通过${settings.offline}来访问。4.Java系统属性:所有通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如:${java.home}5.X:被&properties/&或者外部文件定义的属性,值可以这样访问${someVar}
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&profiles&
&properties&
&user.install&${user.home}/our-project&/user.install&
&/properties&
&/profile&
&/profiles&
&/settings&
如果这个profile被激活,那么属性${user.install}就可以被访问了。仓库(repositories)仓库是Maven用来构筑构建系统的本地仓库的远程项目集合。它来自于被Maven叫做插件和依赖的本地仓库。不同的远程仓库包含不同的项目,当profile被激活,他们就会需找匹配的release或者snapshot构件。
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&profiles&
&repositories&
&repository&
&id&codehausSnapshots&/id&
&name&Codehaus Snapshots&/name&
&releases&
&enabled&false&/enabled&
&updatePolicy&always&/updatePolicy&
&checksumPolicy&warn&/checksumPolicy&
&/releases&
&snapshots&
&enabled&true&/enabled&
&updatePolicy&never&/updatePolicy&
&checksumPolicy&fail&/checksumPolicy&
&/snapshots&
&url&http://snapshots.maven.codehaus.org/maven2&/url&
&layout&default&/layout&
&/repository&
&/repositories&
&pluginRepositories&
&/pluginRepositories&
&/profile&
&/profiles&
&/settings&
releases,snapshots:这是各种构件的策略,release或者snapshot。因了这两个集合,POM可以在单个的仓库中不依赖于另外一个的策略而改变当前策略。例如:一个人可能只下载snapshot用来开发。enable:true或者false,来标记仓库是否为各自的类型激活(release 或者 snapshot)。updatePolicy:这个元素指明了更新的频率。Maven会比较本地POM与远程的时间戳。可选的项目为:always,daily,interval:X,nerver。checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignore,fail,warn,或者不正确的校验和。layout:在上面描述仓库的时候,我们提到他们有统一的布局。这完全正确。使用这个来表明它是default还是legacy。插件仓库(plugin repositories)仓库包含了两种重要类型的构件。第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。无论怎么说,pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。激活配置(Active Profiles)
&settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&
&activeProfiles&
&activeProfile&env-test&/activeProfile&
&/activeProfiles&
&/settings&
settings.xml最后一个谜题是activeProfiles元素。它包含一系列的activeProfile元素,每个都有一个profile id的值,任何profile id被定义到activeProfile的profile将被激活,不管其他的环境设置怎么样。如果没有匹配的profile被找到,那么就什么事情也不做。例如:如果env-test是一个activeProfile,一个在pom.xml或者profile.xml中的具有相应id的profile将被激活。如果没有这样的profile被找到,就什么事也不做,一切照常。原文地址:/yakov/archive//maven2_settings.html
《项目心得》-简单三层使用DataTable向数据库表批量导入数据-向SqlServer多张张表中导入数据
《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer多张张表中导入数据
前面已经介绍过如何向数据库的一张表中批量导入数据,详情见博客《项目经验---简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据》;本文主要介绍如何向SqlServer的多张表中批量导入数据。
如今有这样一个需求,需要批量导入建筑信息,依据数据库表结构设计,批量导入建筑信息,需要向数据库相应的三张表都写入数据。
看一下数据库表结构设计:
在建筑表(TB_Building)中,BuildingID是主键,在建筑类型表(TB_BuildingType)中BuildingTypeID是主键,建筑表与建筑类型之间的关系通过第三张表(建筑类型关系表《TBR_BuildingTypeLink》)来维护,建筑与建筑类型关系表保证了数据的唯一性!
导入建筑信息,需要同时导入建筑与建筑类型的关系,还需要导入建筑与校区的关系(哪一个校区的建筑)。
下面借助《批量导入建筑信息》的实例讲解批量向数据库多张表导入数据的方法。
1.界面设计
观看一下批量导入建筑信息的界面设计:
2.框架结构
此项目的实现,我依然采用简单的三层,看一下项目框架
3.批量向数据库多张表导入数据的实现
下面逐层介绍向数据库导入数据各层的代码实现:
3.1 SqlHelper数据库助手类中添加向数据库表导入数据的方法(SqlHelper.cs)
#region 批量导入DataTable
/// &summary&批量导入DataTable
/// 批量导入DataTable
/// &/summary&
/// &param name="dt"&DataTable数据表&/param&
/// &param name="tableName"&表名&/param&
/// &param name="dtColum"&数据列集合&/param&
/// &return&Boolean值:true成功,false失败&/return&
public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum)
//打开数据库
GetConn();
//声明SqlBulkCopy ,using释放非托管资源
using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn))
//一次批量的插入的数据量
sqlBC.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
sqlBC.BulkCopyTimeout = 60;
//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
//sqlBC.NotifyAfter = 10000;
// sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
//设置要批量写入的表
sqlBC.DestinationTableName = tableN
//自定义的datatable和数据库的字段进行对应
//sqlBC.ColumnMappings.Add("id", "tel");
//sqlBC.ColumnMappings.Add("name", "neirong");
for (int i = 0; i & dtColum.C i++)
sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
//批量写入
sqlBC.WriteToServer(dt);
conn.Dispose();
//GetConn();
//关闭数据库
sqlConn.Close();
#endregion
DAL层批量导入数据的代码(BuildingDAL.cs)
#region 批量添加建筑信息
/// &summary&
/// 建筑管理:批量添加建筑信息:
/// 1.向建筑表添加建筑基本信息
/// 2.向建筑与建筑类型关联表添加建筑与建筑类型的关联信息
/// 3.向建筑与校区关联表添加建筑与校区的关联信息
/// &/summary&
/// &summary&
/// 批量导入建筑信息
/// &/summary&
/// &param name="ds"&DataSet-ds;&/param&
public Boolean ImportBuilding(DataSet ds)
//定义布尔型标记变量,记录建筑是否添加成功
//添加建筑信息
Boolean flagAddB
//添加建筑与建筑类型的关系
Boolean flagAddBuildingT
//添加建筑与校区的关系
Boolean flagAddBuildingC
//执行隐式事务:报错--此操作对该状态的事务无效 的错误于是去掉了事务
//using (TransactionScope scope = new TransactionScope())
//调用sqlHelper的"批量导入datatable表"的方法
flagAddBuilding = sqlHelper.InsertTable(ds.Tables["dt_AddBuilding"], "TB_Building", ds.Tables["dt_AddBuilding"].Columns);
//调用sqlHelper的"批量导入datatable表"的方法
flagAddBuildingType = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingType"], "TBR_BuildingTypeLink", ds.Tables["dt_AddBuildingType"].Columns);
//调用sqlHelper的"批量导入datatable表"的方法
flagAddBuildingCampus = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingCampus"], "TBR_BuildingCampusLink", ds.Tables["dt_AddBuildingCampus"].Columns);
//返回结果
return (flagAddBuilding && flagAddBuildingType && flagAddBuildingCampus);
#endregion
BLL层批量导入数据的代码(BuildingBLL.cs)
#region 批量导入建筑信息
/// &summary&
/// 批量导入建筑信息
/// &/summary&
/// &param name="ds"&DataSet&/param&
/// &returns&是否导入成功:true成功,false失败&/returns&
public Boolean ImportBuiding(DataSet ds)
return buildingDAL.ImportBuilding(ds);
#endregion
3.4 界面层构造DataSet数据,向BLL层传递
这里我依然采用从界面上传Excel,然后从Excel获取输入然后存入DataSet的各DataTable表中。
3.4.1 界面层HTML代码(AddBuilding.aspx)
&div class="block"&
&div class="h"&
&span class="icon-sprite icon-list"&&/span&
&h3&批量导入建筑&/h3&
&div class="bar"&
&a class="btn-lit" href="javascript:history.go('&% =returnCount %&')"&&span&返回&/span&&/a&
&div class="tl corner"&&/div&
&div class="tr corner"&&/div&
&div class="bl corner"&&/div&
&div class="br corner"&&/div&
&div class="cnt-wp"&
&div class="cnt form"&
&%--&form method="post" enctype="multipart/form-data" action=""&--%&
&table class="data-form" cellspacing="0" cellpadding="0"&
&asp:Label ID="Label1" runat="server" Text="提示:请导入扩展名为.xls的文件【工作薄名:Sheet1;表头(如下):】"&&/asp:Label&
&img src="../uploadFileImage/importBuilding.jpg"
alt=""/&&/td&
&asp:FileUpload ID="fupImportBuilding" runat="server" /&
&asp:Button ID="btnImportBuilding" runat="server" Text="批量导入" OnClick="btnImportBuilding_Click" /&
&%-- &/form&--%&
3.4.2 从界面传入Excel,调用BLL层Excel转换成DataTable的方法(AddBuilding.aspx.cs)
#region 批量导入建筑信息
protected void btnImportBuilding_Click(object sender,EventArgs e) {
//建筑业务逻辑层
BuildingBLL buildingBLL = new BuildingBLL();
//BLL层把Excel转化为datatable类
CreateExcelDataBLL createExcelData = new CreateExcelDataBLL();
//获取上传文件地址
string url = fupImportBuilding.PostedFile.FileName.ToString();
if (url == "")
//数据源为空,弹出提示:请选择Excel文件!
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "&script language='javascript' defer&alert('请选择Excel文件!');&/script&");
string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名
DataTable dtAllBuildingCampusT
//在系统中建文件夹up,并将excel文件另存
this.fupImportBuilding.SaveAs(Server.MapPath("~\\UploadFile") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中
//获得文件路径
string strpath = Server.MapPath("~\\UploadFile") + "\\" + urlL
//把上传的Excel转换为datatable
dtAllBuildingCampusType = createExcelData.CreateExcelDataSource(strpath);
DataSet dsBuildingCampusType = new DataSet("ds_BuilingCampusType"); //创建一个名为ds_BuilingCampusType的DataSet
//手动创建的新数据表-建筑数据表
DataTable dtAddBuilding = new DataTable("dt_AddBuilding"); //创建一个名为dt_AddBuilding的DataTalbe
//为dt_AddBuilding表内建立Column(表头),添加数据列:建筑ID、建筑代码、建筑名、是否可用、备注、操作类型、操作内容、操作原因、操作人、操作时间
dtAddBuilding.Columns.Add(new DataColumn("BuildingID", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("BuildingCode", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("BuildingName", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("Descriptions",typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("ActionType", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("ActionContent", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("ActionReason", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("Operator", typeof(string)));
dtAddBuilding.Columns.Add(new DataColumn("SetDatetime", typeof(DateTime)));
//手动创建的新数据表-建筑、建筑类型关系数据表
DataTable dtAddBuildingType = new DataTable("dt_AddBuildingType"); //创建一个名为dt_AddBuildingType的DataTalbe
//为dt_AddBuildingType表内建立Column(表头),添加数据列:建筑ID、建筑类型ID、是否可用
dtAddBuildingType.Columns.Add(new DataColumn("BuildingID", typeof(string)));
dtAddBuildingType.Columns.Add(new DataColumn("BuildingTypeID", typeof(string)));
dtAddBuildingType.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
//手动创建的新数据表-建筑、校区关系数据表
DataTable dtAddBuildingCampus = new DataTable("dt_AddBuildingCampus"); //创建一个名为dt_AddBuildingCampus的DataTalbe
//为dt_AddBuildingCampus表内建立Column(表头),添加数据列:建筑ID、校区ID、是否可用
dtAddBuildingCampus.Columns.Add(new DataColumn("BuildingID", typeof(string)));
dtAddBuildingCampus.Columns.Add(new DataColumn("CampusID", typeof(string)));
dtAddBuildingCampus.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
//从上传的Excel转换为的datatable表中取出数据,分别放入建筑信息表、建筑与建筑类型关系表、建筑与校区关系表
for (int intRow = 0; intRow & dtAllBuildingCampusType.Rows.C intRow++)
string strBuildingID = Guid.NewGuid().ToString();
//建筑代码
string strBuildingCode= dtAllBuildingCampusType.Rows[intRow]["建筑代码"].ToString();
string strBuildingName = dtAllBuildingCampusType.Rows[intRow]["建筑名"].ToString();
//建筑备注
string strBuildingDescription=dtAllBuildingCampusType.Rows[intRow]["备注"].ToString();
//建筑类型代码
string strBuildingTypeCode = dtAllBuildingCampusType.Rows[intRow]["建筑类型代码"].ToString();
//校区代码
string strCampusCode=dtAllBuildingCampusType.Rows[intRow]["校区代码"].ToString();
//根据建筑类型代码获取建筑类型ID
BuildingTypeEntity enBuildingType = new BuildingTypeEntity();
//建筑类型代码
enBuildingType.BuildingTypeCode = strBuildingTypeC
//建筑业务逻辑层,按建筑类型代码查询建筑类型ID
DataTable dtBuildingType = new BuildingBLL().QueryBuildingTypeByCode(enBuildingType);
//建筑类型ID为
string strBuildingTypeID = dtBuildingType.Rows[0]["BuildingTypeID"].ToString();
//根据校区代码获取校区ID
CampusEntity enCampus = new CampusEntity();
//校区代码
enCampus.CampusCode = strCampusC
//建筑业务逻辑层,按校区代码查询校区ID
DataTable dtCampus = new BuildingBLL().QueryCampusByCode(enCampus);
string strCampusID=dtCampus.Rows[0]["CampusID"].ToString();
//添加建筑信息表的新行
DataRow drAddBuilding = dtAddBuilding.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。
//建筑信息表对应的各列值
drAddBuilding["BuildingID"]=strBuildingID;
drAddBuilding["BuildingCode"] = strBuildingC
drAddBuilding["BuildingName"] = strBuildingN
drAddBuilding["IsAvailable"] = "是";
drAddBuilding["Descriptions"] = strBuildingD
drAddBuilding["ActionType"] =
drAddBuilding["ActionContent"] =
drAddBuilding["ActionReason"] =
drAddBuilding["Operator"] =
drAddBuilding["SetDatetime"] = DateTime.N //当前日期时间
dtAddBuilding.Rows.Add(drAddBuilding);
//将一整条数据写入表中
//添加建筑与建筑类型关系信息表的新行
DataRow drAddBuildingType = dtAddBuildingType.NewRow();
//建筑与建筑类型关系信息表对应的各列值
drAddBuildingType["BuildingID"] = strBuildingID;
drAddBuildingType["BuildingTypeID"] = strBuildingTypeID;
drAddBuildingType["IsAvailable"] = "是";
dtAddBuildingType.Rows.Add(drAddBuildingType); //将一整条数据写入表中
//添加建筑与校区关系信息表的新行
DataRow drAddBuildingCampus = dtAddBuildingCampus.NewRow();
//建筑与校区关系信息表对应的各列值
drAddBuildingCampus["BuildingID"] = strBuildingID;
drAddBuildingCampus["CampusID"] = strCampusID;
drAddBuildingCampus["IsAvailable"] = "是";
dtAddBuildingCampus.Rows.Add(drAddBuildingCampus); //将一整条数据写入表中
//将各表加入DataSet中:建筑信息、建筑与建筑类型关系信息、建筑与校区关系信息
dsBuildingCampusType.Tables.Add(dtAddBuilding);
dsBuildingCampusType.Tables.Add(dtAddBuildingType);
dsBuildingCampusType.Tables.Add(dtAddBuildingCampus);
//将DataSet中数据表导入数据库
Boolean flagImportBuilding = buildingBLL.ImportBuiding(dsBuildingCampusType);
if (true==flagImportBuilding)
//导入成功,弹出提示
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "&script language='javascript' defer&alert('建筑信息导入成功!');&/script&");
//导入失败,弹出提示
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "&script language='javascript' defer&alert('建筑信息导入失败!');&/script&");
#endregion
3.4.3 BLL层Excel转换成DataTable的类(MgrCreateExcelData.cs)
/*******************************************************************************
件:CreateExcelDataBLL.cs
*所属小组:评教小组
*文件说明:基础系统-把excel转化为datatable
*创建日期:日9:43:16
*修改作者:
*修改日期:
*修改描述:
*版 本 号:V1.0
*版本号变更记录:
********************************************************************************/
using System.Collections.G
using System.L
using System.T
//引用各命名空间
using System.D
using System.Data.OleDb;
using System.Data.SqlC
using System.IO;
namespace TeachSystem.BLL.CreateExcelDataBLL
public class CreateExcelDataBLL
//构造方法
public CreateExcelDataBLL()
/// &summary&
/// 传入excel路径,转换为datatable
/// &/summary&
/// &param name="url"&&/param&
/// &returns&&/returns&
public DataTable CreateExcelDataSource(string url)
//定义一个DataTable数据表
DataTable dt =
//获得excel数据
string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
//从Excel表的Sheet1单元格获取数据
string strSql = "select * from [Sheet1$]";
OleDbConnection oleConn = new OleDbConnection(connetionStr);
OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);
//把Excel数据填充给DataTable
dt = new DataTable();
oleAdapter.Fill(dt);
//返回数据表
catch (Exception ex)
oleAdapter.Dispose();
oleConn.Close();
oleConn.Dispose();
//删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)
if (File.Exists(url))
File.Delete(url);
至此批量向数据库多张表导入数据的功能已完成了,对想数据库表导入的数据的合法性还需要自己通过代码进进行判断!
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 svn部署到服务器 的文章

 

随机推荐