月度归档:2014年11月

git+maven+tomcatの一个骚年的发布历程

    好吧,你做了个服务,用git当代码库,maven进行编译打包,tomcat做为容器,嗯,这是常见的屌丝套餐。然后,你要发布了,最简单的方式当然是写个发布脚本啦,脑海中浮现出这样的思路:

    1. 清理掉旧代码。

    2. 从git上下载新代码到服务器。

    3. 用maven进行编译,打包。(maven妥妥的为你准备了一堆插件)

    4. 重启tomcat。

    哇塞,好像一切都挺简单的,开搞吧。

    首先,你用rm清理掉旧代码。尼玛,普通用户没有权限!这怎么行,果断修改待清理的文件夹的权限。但你内心隐隐感觉不太对,是的,骚年,权限问题会面将一直伴随着你。(到此,你是否在考虑用sudo权限来执行脚本了,呵呵,先继续往下看吧)

    该是下载代码了:git clone -b ${version} ssh://”$user”@host:port/project.git。哇咔咔,这一步so easy,什么意外都没发生。

    接下来,是重头戏了,编译和打包。首先,进到你的父maven工程里,运行mvn install -Dmaven.test.skip=true。卧槽,又是没有权限。这时候,你又想到了sudo,于是,你小心翼翼地在终端加上sudo试了一下。哗啦啦,拉下一片日志,编译成功,哇哈哈,偶是甜菜!然后你兴高采烈地将脚本里的命令改为sudo mvn install -Dmaven.test.skip=true,运行脚本,呵呵,你傻眼了。

    sudo: mvn: command not found

    唉,忽然感觉心好累。百度啊~google啊~,你试了一圈,没错,不管用,不要问我这是为嘛,我滴故乡在远方。好吧,你改回用普通用户执行脚本,不用sudo了,接着把maven的本地仓库权限也改了。终于,install成功了。

    人生还得继续,你进入待发布成war包的工程下,执行mvn tomcat:redeploy(首次发布使用mvn tomcat:deploy。另外,网上会告诉你mvn tomcat7:deploy,这个不知是否只适用于tomcat7,偶们用的是tomcat8)

    呼~你常常吐出一口气,总算大体完成了,重启tomcat(这个命令太简单,偶不想说),进入tomcat服务URL下的/manager/,看到,瓦伊!服务怎么没起来。

    各种猜测纷至沓来了,tomcat的服务的密码权限没配置好?tomcat8无法使用maven插件来发布?打包没打好?

    骚年于是到处查查看看,什么问题都木有发现。

    不对啊,我应该看tomcat启动日志才对哦(默认在tomcat安装目录的/logs/catalina.out ),呵呵,偶是sb,数据库没连上,没在hosts中配置数据库URL对应的ip。

   改之,重启,OK。

   这件事,告诉我们,日志是多!么!重!要!啊!

    欧拉,碎觉!

    【附录】

    发布成war包的pom.xml

<build>
<finalName>projectName</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
<meminitial>128m</meminitial>
<maxmem>512m</maxmem>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceExcludes>
/test/
</warSourceExcludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://host/:port/manager</url>
<!– server、username、password对应maven的setting下的配置 –>
<server>test</server>
<username>test</username>
<password>test</password>
<path>/</path>
<!– war文件路径缺省情况下指向target –>
<!–<warFile>${basedir}/target/${project.build.finalName}.war</warFile> –>
</configuration>
</plugin>
</plugins>

</pluginManagement>
</build>

【Android】自定义Style或Theme及自定义ActionBar

以前做Launcher的时候是采用3D引擎,对于UI好多界面都是靠代码布局和绘制,基本上很怎么关注过style和theme(xml)的自定义。现在用到了基本上是从头学习和总结了一番,对多数人来说可能比较初级,blog之简单mark下。干货:

一、定义一个Style。

一些多处用到的style,比如定义一个统一风格的Button(其他控件都一样)。

一个布局xml中正常普通的Button:

<Button
    android:layout_width="fill_parent"
    android:layout_height="@dimen/st_button_normal_height"
    android:layout_gravity="center"
    android:background="@drawable/st_button_normal_bg"
    android:textColor="@color/st_button_normal_textcolor"
    android:textSize="@dimen/st_button_normal_textsize"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:text="@string/st_create_activity_create" />

提取红色部分项到style.xml成为自定义style:

<style name="NormalButton">
    <item name="android:layout_gravity">center</item>
    <item name="android:background">@drawable/st_button_normal_bg</item>
    <item name="android:textColor">@color/st_button_normal_textcolor</item>
    <item name="android:textSize">@dimen/st_button_normal_textsize</item>
 </style>

在布局xml的Button中使用:

<Button
    style="@style/NormalButton"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/st_button_normal_height"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:text="@string/st_create_activity_create" />

style可继承,可继承自己定义的style,也可以继承Android提供的style:

<style name="CustomButton" parent="NormalButton">
    <item name="android:layout_height">wrap_content</item>
 </style>

二、自定义全局的App Theme。

自定义一个theme:

<color name="custom_theme_color">#b0b0ff</color>
<style name="CustomTheme" parent="android:Theme.Light">
    <item name="android:windowBackground">@color/custom_theme_color</item>
    <item name="android:colorBackground">@color/custom_theme_color</item>
</style>

这里继承了系统的Theme.Light主题,并定义了两个属性,还有其他很多属性标签,自己按需定义,继承的parent自己也可以按需选择。

使用自定义的全局theme:

在AndroidManifest.xml的Application标签中添加:

<application android:theme="@style/CustomTheme">

这样便定义了全局的theme,假如个别的activity想使用其他theme怎么办?其实activity标签也支持设定一个theme,只要在Activity标签中添加同样一句代码即可,并且Android提供了很多的Theme可供选择:

<activity android:theme="@android:style/Theme.Dialog">

三、自定义ActionBar的theme。

因为涉及到Android版本支持的问题,这个略麻烦一点,不过官方和第三方库都有解决方案。

对于Android3.0及之上,自定义theme的时候,设置actionBarStyle即可:

res/values/themes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>
    </style>
</resources>

然后像中那样设置application的theme即可。

对于2.1~3.0(不含)之间的版本可以使用android的support库v7-appcompat进行ActionBar的支持:

res/values/themes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- the theme applied to the application or activity -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>

        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

    <!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>

        <!-- Support library compatibility -->
        <item name="background">@drawable/actionbar_background</item>
    </style>
</resources>

注意红字部分必须添加,不然自定义不会生效。

另外是如果使用v7-appcompat库进行ActionBar的支持,则自定义theme必须继承自Theme.AppCompat(或继承自这个theme的其他Android提供的Theme),否则会报错。

四、这是没有什么可总结的总结

一~三基本够用了,需要定义什么属性自己按需就好了。