ant构建java项目

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。

1. 用java命令编译,打包java文件

  • 无包结构的java源代码
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World, this is a class without package");
    }
}

javac编译

E:\ant\SpaceMgt\src>javac Hello.java

E:\ant\SpaceMgt\src>java Hello
Hello World, this is a class without package

这时会发现在当前目录下会出现 Hello.class文件,说明java代码已经编译成字节码class

  • 有包结构的java源代码
package com.rick;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World, this is a class with package");
    }
}

javac编译

E:\ant\SpaceMgt\src>javac -d . Hello.java

E:\ant\SpaceMgt\src>java com.rick.Hello
Hello World, this is a class with package

这时会发现在当前目录下新建目录com/rick/Hello.class文件,说明java代码已经编译成字节码class,同时在包中

jar打包

E:\ant\SpaceMgt\src>jar -cvf hello.jar com
已添加清单
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/rick/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/rick/Hello.class(输入 = 454) (输出 = 317)(压缩了 30%)

运行jar文件
如果这个是个可执行的jar,可以这么运行

E:\ant\SpaceMgt\src>java -jar hello.jar
hello.jar中没有主清单属性

因为hello.jar不是可执行的jar,所以会抛出错误:hello.jar中没有主清单属性。可以通过以下两种方式执行jar文件中的main方法

E:\ant\SpaceMgt\src>set classpath=hello.jar

E:\ant\SpaceMgt\src>java com.rick.Hello
Hello World, this is a class with package

E:\ant\SpaceMgt\src>java -cp hello.jar com.rick.Hello
Hello World, this is a class with package

如何让jar成为可执行的jar呢?编辑jar中META-INF/MANIFEST.MF,添加一行

Main-Class: com.rick.Hello

2. 用ant编译,打包jar文件

检查ant环境

E:\ant\SpaceMgt\src>ant -version
Apache Ant(TM) version 1.9.6 compiled on June 29 2015

项目的目录结构:

    SpaceMgt
        build
        src
            |com
            |rick
                |Hello.java
        build.xml        

ant需要配置文件build.xml

<project basedir="." default="publish" name="SpaceMgt">
    <target name="publish">
         <javac srcdir="src" destdir="build">

         </javac>
         <jar basedir="build" destfile="build/jar/hello.jar"/>

    </target>
</project>

执行ant命令

E:\ant\SpaceMgt>ant
Buildfile: E:\ant\SpaceMgt\build.xml

publish:
    [javac] E:\ant\SpaceMgt\build.xml:3: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
      [jar] Building jar: E:\ant\SpaceMgt\build\jar\hello.jar

BUILD SUCCESSFUL
Total time: 0 seconds

完成之后,你会看见build/jar/hello.jar

3. 用ant编译,打包war文件

项目的目录结构:

    SpaceMgt
        build
        src
            |com
            |rick
                |Hello.java
        WebRoot
            |WEB-INF
                lib
                web.xml
            |index.jsp
        build.xml        

build.xml

<project basedir="." default="publish" name="SpaceMgt">
    <target name="publish">
        <property name="build.dest" value="build/war/SpaceMgt"/>    

         <mkdir dir="${build.dest}/WEB-INF/classes"/>

         <copy todir="${build.dest}">  
            <fileset dir="WebRoot"/>  
         </copy>  

         <javac srcdir="src" destdir="${build.dest}/WEB-INF/classes">
         </javac>

         <war warfile="build/war/SpaceMgt.war" basedir="${build.dest}" webxml="${build.dest}/WEB-INF/web.xml"/>  

    </target>
</project>

执行ant

E:\ant\SpaceMgt>ant
Buildfile: E:\ant\SpaceMgt\build.xml

publish:
    [javac] E:\ant\SpaceMgt\build.xml:11: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
      [war] Building war: E:\ant\SpaceMgt\build\war\SpaceMgt.war

BUILD SUCCESSFUL
Total time: 0 seconds

将SpaceMgt.war放入tomcat webapp下,启动tomcat访问url:http://localhost:8080/SpaceMgt/index.jsp

3. ant其他功能

通过ant不仅可以编译打包,还能上传文件到ftp/scp

example:

 <ftp server="ftp.apache.org"
       userid="anonymous"
       password="me@myorg.com">
    <fileset dir="htdocs/manual"/>
  </ftp>

  <scp file="myfile.txt" todir="user:password@somehost:/home/chuck"/>

  ....

具体可参照:

  1. http://ant.apache.org/manual/Tasks/scp.html
  2. http://ant.apache.org/manual/Tasks/ftp.html

注意这里需要一些jar的支持,ftp需要common-net.jar,scp需要jsch-0.1.40.jar
下载jar到ANT_HOME/lib目录下,并在build.xml指定classpath

<property name="ANT_HOME" value="D:\develop\apache-ant-1.9.6"/>

<path id="classpath">
    <fileset dir="${ANT_HOME}">
        <include name="**/*.jar"/>
    </fileset>
</path>

ant常见命令可参考:http://www.cnblogs.com/xionghui/archive/2012/03/13/2393679.html

Oracle一列的多行数据拼成一行显示字符

转自http://zhoujingxian.iteye.com/blog/1774235

Oracle一列的多行数据拼成一行显示字符,例如:
id name
========
1 aa
2 bb
3 cc

要的结果是”aa,bb,cc”

oracle 提供了两个函数WMSYS.WM_CONCATListAgg函数。

WMSYS.WM_CONCAT函数

select WMSYS.WM_CONCAT(a.name) from user a

这样的话,查询出的结果:”aa,bb,cc”

分隔符如果不需要用英文的逗号,需要改成别的符号比如分号的,可以用下面的方法替换下:

select replace(WMSYS.WM_CONCAT(a.name),',',';') from user a

结果:”aa;bb;cc”

ListAgg函数

listagg函数的语法结构如下:
LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]
listagg虽然是聚合函数,但可以提供分析功能(比如可选的OVER()子句)。使用listagg中,下列中的元素是必须的:

  • 需要聚合的列或者表达式
  • WITH GROUP 关键词
  • 分组中的ORDER BY子句

例子:

DEPTNO ENAME
============
   10 CLARK
   10 KING
   10 MILLER
   20 ADAMS
   20 FORD
   20 JONES

按照DEPTNO字段分组,对结果集进行字符串聚合,结果如下:

DEPTNO AGGREGATED_ENAMES
=======================
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES

SQL:

SELECT deptno,LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM  emp GROUP BY deptno;

IDEA开发 Maven打包可执行的jar JSmooth转exe文件

这个文章主要解决这样几个问题

  1. IDEA如何用Maven管理项目
  2. Maven如何打包成可执行jar
  3. JSmooth转jar为exe文件

IDEA如何用Maven管理项目



Maven如何打包成可执行jar

在pom.xml中配置
com.rick.client.App是main函数所在的类

<plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.rick.client.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>ibiblio.org</id>
            <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
            <url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
        </repository>
    </repositories>

执行mvn命令,打包可执行jar

E:\p4v_location\watsonsTNA\fine>mvn assembly:assembly
E:\p4v_location\watsonsTNA\fine\target>java -jar exe-1.0-SNAPSHOT.jar

JSmooth转jar为exe文件



Python高级编程使用__slots__

这这一节主要是动态为对象/实例添加属性和方法

代码如下

from types import MethodType

#这是外部方法1
def set_name(self, name):
    self.name = name


#这是外部方法2
def set_score(self, score):
    self.score = score    

class Student(object):
    __slots__ = ('name')

    def set_age(self, age):
        self.age = age

stu = Student();
stu.age = 10
stu.set_age(20)

#给实例绑定一个方法,此处绑定到实例stu,对其他实例不起作用
stu.set_name = MethodType(set_name, stu) # 给实例绑定一个方法
stu.set_name('Rick')

print(stu.name)    

#给类绑定一个方法,所有的实例都可以使用
Student.set_score = MethodType(set_score, Student)
stu.set_score(99.5)
print(stu.score)

使用slots

但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加namescore属性

class Student(object):
    __slots__ = ('name', 'store') # 用tuple定义允许绑定的属性名称

如果有不允许的属性,将会抛出异常

F:\python>python slots.py
Traceback (most recent call last):
  File "slots.py", line 18, in <module>
    stu.age = 10
AttributeError: 'Student' object has no attribute 'age'

Note:
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

spring开发邮件设置及注意事项

spring开发邮件设置及注意事项

常见的电子邮件协议有以下几种:SMTP(简单邮件传输协议)、POP3(邮局协议)、IMAP(Internet邮件访问协议)。这几种协议都是由TCP/IP协议族定义的。

  • SMTP(Simple Mail Transfer Protocol):SMTP主要负责底层的邮件系统如何将邮件从一台机器传至另外一台机器。
  • POP(Post Office Protocol):版本为POP3,POP3是把邮件从电子邮箱中传输到本地计算机的协议。
  • IMAP(Internet Message Access Protocol):版本为IMAP4,是POP3的一种替代协议,提供了邮件检索和邮件处理的新功能,这样用户可以完全不必下载邮件正文就可以看到邮件的标题摘要,从邮件客户端软件就可以对服务器上的邮件和文件夹目录等进行操作。IMAP协议增强了电子邮件的灵活性,同时也减少了垃圾邮件对本地系统的直接危害,同时相对节省了用户察看电子邮件的时间。除此之外,IMAP协议可以记忆用户在脱机状态下对邮件的操作(例如移动邮件,删除邮件等)在下一次打开网络连接的时候会自动执行。

开发中默认的协议就是SMTP

我本地用163邮箱进行测试,通过,代码如下

JavaMailSenderImpl senderImpl = new JavaMailSenderImpl(); 

//设定mail server 
senderImpl.setHost("smtp.163.com"); 

//邮件的默认设置协议是`smtp`,端口`25`
//senderImpl.setPort(25); 
//senderImpl.setProtocol("smtp");
//建立邮件消息,发送简单邮件和html邮件的区别 
MimeMessage mailMessage = senderImpl.createMimeMessage(); 
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage); 

//设置收件人,寄件人 
messageHelper.setTo("Rick.Xu@movit-tech.com"); 
messageHelper.setFrom("jkxyx205@163.com"); 
messageHelper.setSubject("这个是主题"); 
//true 表示启动HTML格式的邮件 
messageHelper.setText("<html><head></head><body><h1>hello!!spring html Mail</h1></body></html>",true); 
senderImpl.setUsername("jkxyx205@163.com") ; //设置username
//      senderImpl.setPassword("xxx") ; // 设置password

//发送邮件 
senderImpl.send(mailMessage); 

System.out.println("邮件发送成功..."); 

生产环境,客户给出的邮件配置信息

host:10.32.186.111
port:25
sender:support@abc.net
pwd:空

相应的设置只需要修改host,端口和协议默认即可

senderImpl.setHost("10.32.186.111"); 
messageHelper.setFrom("support@abc.net"); 

这时候会抛出异常:

org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: failed to connect, no password specified?

异常给出的提示,说密码不能为空,做如下设置就可以使密码可以为空

Properties prop = new Properties() ;
prop.put("mail.smtp.auth", "false") ; // 如果这个参数设为true,让服务器进行认证,认证用户名和密码是否正确
senderImpl.setJavaMailProperties(prop); 

常用的邮箱服务器(SMTP、POP3)地址、端口

gmail(google.com)
POP3服务器地址:pop.gmail.com(SSL启用 端口:995)
SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)

21cn.com: 
POP3服务器地址:pop.21cn.com(端口:110)
SMTP服务器地址:smtp.21cn.com(端口:25)

sina.com: 
POP3服务器地址:pop3.sina.com.cn(端口:110)
SMTP服务器地址:smtp.sina.com.cn(端口:25) 

tom.com: 
POP3服务器地址:pop.tom.com(端口:110)
SMTP服务器地址:smtp.tom.com(端口:25)

163.com: 
POP3服务器地址:pop.163.com(端口:110)
SMTP服务器地址:smtp.163.com(端口:25)

263.net: 
POP3服务器地址:pop3.263.net(端口:110)
SMTP服务器地址:smtp.263.net(端口:25)

yahoo.com: 
POP3服务器地址:pop.mail.yahoo.com
SMTP服务器地址:smtp.mail.yahoo.com

263.net.cn: 
POP3服务器地址:pop.263.net.cn(端口:110)
SMTP服务器地址:smtp.263.net.cn(端口:25)

Foxmail:
POP3服务器地址:POP.foxmail.com(端口:110)
SMTP服务器地址:SMTP.foxmail.com(端口:25)

sinaVIP  
POP3服务器:pop3.vip.sina.com (端口:110)
SMTP服务器:smtp.vip.sina.com (端口:25)

sohu.com: 
POP3服务器地址:pop3.sohu.com(端口:110)
SMTP服务器地址:smtp.sohu.com(端口:25)

etang.com: 
POP3服务器地址:pop.etang.com
SMTP服务器地址:smtp.etang.com

x263.net: 
POP3服务器地址:pop.x263.net(端口:110)
SMTP服务器地址:smtp.x263.net(端口:25)

yahoo.com.cn: 
POP3服务器地址:pop.mail.yahoo.com.cn(端口:995)
SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587)
雅虎邮箱POP3的SSL不启用端口为110,POP3的SSL启用端口995;SMTP的SSL不启用端口为25,SMTP的SSL启用端口为465

QQ邮箱                                       QQ企业邮箱           
POP3服务器地址:pop.qq.com(端口:110)            POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)        
SMTP服务器地址:smtp.qq.com (端口:25)           SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)
SMTP服务器需要身份验证

126邮箱                                      HotMail
POP3服务器地址:pop.126.com(端口:110)            POP3服务器地址:pop.live.com (端口:995)
SMTP服务器地址:smtp.126.com(端口:25)            SMTP服务器地址:smtp.live.com (端口:587)

china.com:                                   139邮箱
POP3服务器地址:pop.china.com(端口:110)         POP3服务器地址:POP.139.com(端口:110) 
SMTP服务器地址:smtp.china.com(端口:25)         SMTP服务器地址:SMTP.139.com(端口:25)