温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

雪山飞鹄

温馨提示:您的每一次转载,体现了我写此文的意义!!!烦请您在转载时注明出处http://www.blogjava.net/sxyx2008/谢谢合作!!!

BlogJava 首页 新随笔 联系 聚合 管理
  215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks

2012年3月28日 #

该项目基于maven3.0构建的,项目中融合了Struts1、Struts2、Spring、SpringMVC、Hibernate、Ibatis、MyBatis、Spring Data JPA、Spring JDBC、Spring DWR。页面展现这里使用Struts1、Struts2、SpringMVC(jsp视图、velocity视图、freemarker视图、pdf视图、excel视图、xml视图、json视图等)。是一个综合性行的项目。该项目后期会陆续集成Spring的一些好的框架进来比如说Spring Web Flow、Spring Security 、Jbpm、WebService、Compass、Solr、nutch等。总之是一个综合性的项目。该项目不处理业务,主要是把目前自己工作中用到过的各种框架糅合到一个项目中。纯粹是一个jee框架的糅合,主要是介绍各种技术。

介绍下目前使用的各个框架的版本信息

Struts1 1.3.10

Struts2 2.3.8

Spring 3.2.0.RELEASE

Hibernate 4.2.0.Final

Ibatis 2.3.4.726

MyBatis 3.1.1

Spring Data JPA 1.3.0.RELEASE

DWR 3.0.M1

项目中的持久化框架sql语句的跟踪采用了log4jdbc4结合log4j,在控制台可以看到完整的sql语句。

该项目中使用到的技术均与Spring已集成。除了DWR与Spring集成使用xml文件中配置bean外 其他的bean均使用注解完善。每一个与数据库有关的都有事务处理。

项目结构图


项目托管SVN地址:http://maven-framework-project.googlecode.com/svn/trunk/ (限于大陆google code 不稳定,导致经常无法访问,该地址已不在同步,建议使用github地址)
项目托管GitHub地址:https://github.com/sxyx2008/maven-framework-project/(推荐使用)

最后希望有兴趣的朋友可以加入进来,大家一起完善他。把自己的技术分享出来。如有任何问题可以与我联系

联系方式

QQ:184675420

Email:sxyx2008@gmail.com

posted @ 2012-09-25 11:40 雪山飞鹄 阅读(5072) | 评论 (2)编辑 收藏

build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="run" name="build-project-with-ant">
    
    <!-- 最终编译后的jar包名称 -->
    <property name="jar.prefix-name" value="cms"></property>
    <property name="jar.version" value="1.0"></property>
    <property name="tomcat.version" value="6.0.18" />
    
    <property name="mailhost" value="smtp.qq.com"></property>
    <property name="username" value="**********" />
    <property name="password" value="**********"></property>
    <property name="mailfrom" value="184675420@qq.com" />
    <property name="mailto" value="184675420@qq.com"></property>
    <property name="mailsubject" value="使用Ant自助构建项目测试打包文档"></property>
    
    <!-- 项目构建时所需要的lib -->
    <property name="project.lib.dir" value="${basedir}/WebRoot/WEB-INF/lib"></property>

    <!-- 项目构建时tomcat的home目录 -->
    <property name="tomcat.download.url" value="http://archive.apache.org/dist/tomcat/tomcat-6/v${tomcat.version}/bin/apache-tomcat-${tomcat.version}.zip"></property>
    
    <!-- 项目构建时下载tomcat的存放目录 -->
    <property name="tomcat.dir" value="${basedir}/dist/"></property>
    
    <!-- 定义项目的当前目录 -->
    <property name="basedir" value="."/>
    <!-- 定义项目源码目录 -->
    <property name="src.dir" value="${basedir}/src"></property>
    <!-- 定义项目源码编译后的目录 -->
    <property name="build.dir" value="${basedir}/classes"></property>
    <!-- 定义项目最终编译生成的目录 -->
    <property name="dist.dir" value="${basedir}/dist"></property>
    <!-- 定义项目文档的目录 -->
    <property name="doc.dir" value="${basedir}/doc"></property>
    <!-- 定义项目文档api的目录 -->
    <property name="doc.dir.api" value="${doc.dir}/api"></property>
    <!-- 定义项目单元测试文档的目录 -->
    <property name="junit.doc.dir" value="${basedir}/doc/api/junit"></property>
    <!-- 定义项目单元测试源码的目录 -->    
    <property name="junit.src.dir" value="${basedir}/test"></property>
    <!-- 定义项目单元测试编译的目录 -->    
    <property name="junit.dir" value="${basedir}/junit"></property>
    <property name="junit.build.dir" value="${junit.dir}/classes"></property>
    <!-- 定义项目单元测试测试报告的目录 -->    
    <property name="junit.report.dir" value="${junit.dir}/report"></property>
    
    
    <target name="init" description="init">
        
        <echo>项目初始化设置</echo>
        
        <delete dir="${build.dir}"></delete>
        <delete dir="${dist.dir}"></delete>
        <delete dir="${doc.dir}"></delete>
        <delete dir="${junit.dir}"></delete>
        
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${doc.dir}"/>
        <mkdir dir="${junit.build.dir}"/>
        <mkdir dir="${junit.report.dir}"/>
        
    </target>
    
    
    <target name="compile" depends="init" description="compile source">
        <echo>编译源码</echo>
        <javac srcdir="${src.dir}" includeantruntime="false" destdir="${build.dir}" verbose="true">
        <classpath>
            <fileset dir="${project.lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
        </javac>
    </target>


    <target name="api-doc" depends="compile" description="build javadoc">
        <echo>生成api-doc帮助文档</echo>
        <javadoc
               destdir="${doc.dir.api}"
               author="true"
               version="true"
               use="true"
               windowtitle="${jar.prefix-name} API"
               sourcepath="${src.dir}">
            <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
            <bottom><![CDATA[<i>Copyright © 2012 Dummy Corp. All Rights Reserved.</i>]]></bottom>
            
            <classpath>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
        </javadoc>
    </target>
    
    <target name="junit-javac" depends="api-doc" description="junit test case compile">
        <echo>编译junit</echo>
        <javac destdir="${junit.build.dir}" srcdir="${junit.src.dir}" fork="false" includeantruntime="false">
        <classpath>
            <fileset dir="${project.lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
        </javac>
    </target>
    
    <target name="junit-run" depends="junit-javac" description="junit test case execute">
        <echo>运行单元测试</echo>
        <junit printsummary="yes" haltonfailure="false">
            <classpath>
                <pathelement location="${junit.build.dir}"/>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="${junit.report.dir}">
                <fileset dir="${junit.src.dir}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>
    
    <target name="junit-report" depends="junit-run" description="junit test case report">
        <echo>生成单元测试报告</echo>
        <junitreport todir="${junit.report.dir}">
            <fileset dir="${junit.report.dir}">
                <include name="**/*.xml"/>
            </fileset>
            <report format="frames" todir="${junit.report.dir}/html"/>
        </junitreport>
        
    </target>
    
    <target name="junit-doc" depends="junit-report" description="build javadoc">
        <echo>生成junit-doc帮助文档</echo>
        <javadoc
               destdir="${junit.doc.dir}"
               author="true"
               version="true"
               use="true"
               windowtitle="Junit Test API"
               sourcepath="${junit.src.dir}">
            <classpath>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
            <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
            <bottom><![CDATA[<i>Copyright © 2012 Dummy Corp. All Rights Reserved.</i>]]></bottom>
        </javadoc>
    </target>
    
    <target name="package" depends="api-doc" description="package">
        <echo>使用jar打包编译后的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-${jar.version}.jar" includes="**/*.class" basedir="${build.dir}">
        </jar>
        <echo>使用zip打包源码</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-source.zip" basedir="${src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打包javadoc</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-doc.zip" basedir="${doc.dir.api}">
        </zip>
        <echo>使用war打war包</echo>
        <war destfile="${dist.dir}/${jar.prefix-name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
            <fileset dir="${basedir}/WebRoot">
                <include name="**/*.*"/>
            </fileset>
            <!--
            <lib dir="${basedir}/WebRoot/WEB-INF/lib"></lib>
            <classes dir="${basedir}/WebRoot/WEB-INF/classes"></classes>
            -->
        </war>
    </target>
    
    <target name="junit-package" depends="junit-doc" description="junit-package">
        <echo>打包</echo>
        <echo>使用jar打包编译后的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-${jar.version}.jar" includes="**/*.class" basedir="${build.dir}">
        </jar>
        <echo>使用zip打包源码</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-source.zip" basedir="${src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打包javadoc</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-doc.zip" basedir="${doc.dir.api}">
        </zip>
        <echo>使用war打war包</echo>
        <war destfile="${dist.dir}/${jar.prefix-name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
            <fileset dir="${basedir}/WebRoot">
                <include name="**/*.*"/>
            </fileset>
            <!--
            <lib dir="${basedir}/WebRoot/WEB-INF/lib"></lib>
            <classes dir="${basedir}/WebRoot/WEB-INF/classes"></classes>
            -->
        </war>
        <echo>使用jar打junit单元测试编译好的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-junit-${jar.version}.jar" includes="**/*.class" basedir="${junit.build.dir}">
        </jar>
        <echo>使用zip打junit单元测试源文件</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-junit-source.zip" basedir="${junit.src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打junit单元测试测试报告</echo>
        <zip destfile="${dist.dir}/junit-report.zip" basedir="${junit.report.dir}/html">
        </zip>
    </target>
    
    
    
    <target name="clean">
        <echo>清理项目</echo>
        <delete dir="${build.dir}" includeemptydirs="true"></delete>
        <delete dir="${doc.dir}" includeemptydirs="true"></delete>
        <delete dir="${junit.dir}" includeemptydirs="true"></delete>
    </target>
    
    
    <target name="mail"  description="use java mail send mail message" depends="clean">
        
        <echo>将打包的文件email发送</echo>
        <mail
            mailhost="${mailhost}"
            mailport="25"
            subject="${mailsubject}"  
            charset="utf-8"
            user="${username}"
            password="${password}"
            >
          <from address="${mailfrom}"/>
          <to address="${mailto}"/>
          <message>使用Ant自助构建项目测试打包文档</message>
          <attachments>
            <fileset dir="${dist.dir}">
              <include name="*.*"/>
            </fileset>
          </attachments>
        </mail>
    </target>
    
    
    <target name="wget" depends="mail">
        <echo>下载tomcat</echo>
        <get dest="${tomcat.dir}" verbose="true">
          <url url="${tomcat.download.url}"/>
        </get>
    </target>
    
    
    <target name="unzip" depends="wget">
        <echo>解压tomcat</echo>
        <unzip src="${tomcat.dir}/apache-tomcat-${tomcat.version}.zip" dest="${tomcat.dir}">
        </unzip>
    </target>
    
    <target name="copy" depends="unzip">
        <echo>拷贝war包到tomcat中部署</echo>
         <copy file="${dist.dir}/${jar.prefix-name}.war" tofile="${tomcat.dir}/apache-tomcat-${tomcat.version}/webapps/${jar.prefix-name}.war"/>
    </target>
    
    <target name="startup" depends="copy">
        <echo>启动tomcat web容器</echo>
        <exec executable="${tomcat.dir}/apache-tomcat-${tomcat.version}/bin/startup.bat">
             <env key="CATALINA_HOME" path="${tomcat.dir}/apache-tomcat-${tomcat.version}/"/>
        </exec>
    </target>
    
    
    <target name="run" depends="package,startup" description="不存在单元测试时执行的任务">
    </target>
    
    <target name="junitrun" depends="junit-package,startup" description="存在单元测试时执行的任务">
    </target>
    
    
    
    
</project>
构建控制台日志
init:
     [echo] 项目初始化设置
   [delete] Deleting directory D:\workspace\Ant1\classes
   [delete] Deleting directory D:\workspace\Ant1\dist
   [delete] Deleting directory D:\workspace\Ant1\doc
   [delete] Deleting directory D:\workspace\Ant1\junit
    [mkdir] Created dir: D:\workspace\Ant1\classes
    [mkdir] Created dir: D:\workspace\Ant1\dist
    [mkdir] Created dir: D:\workspace\Ant1\doc
    [mkdir] Created dir: D:\workspace\Ant1\junit\classes
    [mkdir] Created dir: D:\workspace\Ant1\junit\report
compile:
     [echo] 编译源码
    [javac] Compiling 3 source files to D:\workspace\Ant1\classes
junit-javac:
     [echo] 编译junit
    [javac] Compiling 1 source file to D:\workspace\Ant1\junit\classes
junit-run:
     [echo] 运行单元测试
    [junit] Running com.junit.test.OtherTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.027 sec
junit-report:
     [echo] 生成单元测试报告
[junitreport] Processing D:\workspace\Ant1\junit\report\TESTS-TestSuites.xml to C:\Users\scott\AppData\Local\Temp\null1056173236
[junitreport] Loading stylesheet jar:file:/E:/apache-ant-1.8.4/lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
[junitreport] Transform time: 334ms
[junitreport] Deleting: C:\Users\scott\AppData\Local\Temp\null1056173236
doc:
     [echo] 生成帮助文档
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 正在创建目标目录: "D:\workspace\Ant1\doc\api\"
  [javadoc] 正在装入软件包 com.ant.lesson1 的源文件...
  [javadoc] 正在构造 Javadoc 信息...
  [javadoc] 标准 Doclet 版本 1.6.0_25
  [javadoc] 正在构建所有软件包和类的树...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\Main.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\MyHttpServlet.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\SimpleTask.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-summary.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\constant-values.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\serialized-form.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\SimpleTask.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\MyHttpServlet.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\Main.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-use.html...
  [javadoc] 正在构建所有软件包和类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\overview-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\index-all.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\deprecated-list.html...
  [javadoc] 正在构建所有类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\allclasses-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\allclasses-noframe.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\index.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\help-doc.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\stylesheet.css...
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 正在创建目标目录: "D:\workspace\Ant1\doc\api\junit\"
  [javadoc] 正在装入软件包 com.junit.test 的源文件...
  [javadoc] 正在构造 Javadoc 信息...
  [javadoc] 标准 Doclet 版本 1.6.0_25
  [javadoc] 正在构建所有软件包和类的树...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\OtherTest.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-summary.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\constant-values.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\class-use\OtherTest.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-use.html...
  [javadoc] 正在构建所有软件包和类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\overview-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\index-all.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\deprecated-list.html...
  [javadoc] 正在构建所有类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\allclasses-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\allclasses-noframe.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\index.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\help-doc.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\stylesheet.css...
package:
     [echo] 打包
      [jar] Building jar: D:\workspace\Ant1\dist\cms-1.0.jar
      [zip] Building zip: D:\workspace\Ant1\dist\cms-source.zip
      [zip] Building zip: D:\workspace\Ant1\dist\cms-doc.zip
      [jar] Building jar: D:\workspace\Ant1\dist\cms-junit-1.0.jar
      [zip] Building zip: D:\workspace\Ant1\dist\cms-junit-source.zip
      [zip] Building zip: D:\workspace\Ant1\dist\junit-report.zip
      [war] Building war: D:\workspace\Ant1\dist\cms.war
clean:
     [echo] 清理项目
   [delete] Deleting directory D:\workspace\Ant1\classes
   [delete] Deleting directory D:\workspace\Ant1\doc
   [delete] Deleting directory D:\workspace\Ant1\junit
mail:
     [echo] 将打包的文件email发送
     [mail] Sending email: Test build
最终编译后的目录为
posted @ 2012-09-05 16:26 雪山飞鹄 阅读(2776) | 评论 (0)编辑 收藏

 

package com.shortcut;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;

public class AddShortCutActivity extends Activity {
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
boolean flag = IfaddShortCut();// 如果已经创建,则不需要在创建
        if (flag == false{
            addShortCut();
        }

    }


    
public void addShortCut() {
        Intent shortcut 
= new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
        
// 设置属性
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,getResources().getString(R.string.app_name));
        ShortcutIconResource iconRes 
= Intent.ShortcutIconResource.fromContext(AddShortCutActivity.this, R.drawable.ic_launcher);
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON, iconRes);

        
// 是否允许重复创建
        shortcut.putExtra("duplicate"false);
        Intent intent 
= new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setClass(AddShortCutActivity.
this, AddShortCutActivity.class);
        
// 设置启动程序
        System.out.println("createIcon");
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
        AddShortCutActivity.
this.sendBroadcast(shortcut);
    }


    
public boolean IfaddShortCut() {
        
boolean isInstallShortcut = false;
        
final ContentResolver cr = AddShortCutActivity.this.getContentResolver();
        
// 本人的2.2系统是”com.android.launcher2.settings”,网上见其他的为"com.android.launcher.settings"
        final String AUTHORITY = "com.android.launcher2.settings";
        
final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true");
        Cursor c 
= cr.query(CONTENT_URI,
                
new String[] "title""iconResource" }"title=?",
                
new String[] { getString(R.string.app_name) }null);
        
if (c != null && c.getCount() > 0{
            isInstallShortcut 
= true;
        }

        
return isInstallShortcut;
    }

}

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
="com.shortcut"
    android:versionCode
="1"
    android:versionName
="1.0" >

    
<uses-sdk android:minSdkVersion="8" />

    
<application
        
android:icon="@drawable/ic_launcher"
        android:label
="@string/app_name" >
        
<activity
            
android:label="@string/app_name"
            android:name
=".AddShortCutActivity" >
            
<intent-filter >
                
<action android:name="android.intent.action.MAIN" />
                
<category android:name="android.intent.category.LAUNCHER" />
            
</intent-filter>
            
<intent-filter>  
                
<action android:name="android.intent.action.CREATE_SHORTCUT"></action>  
            
</intent-filter>  
        
</activity>
    
</application>
    
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>   
    
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>  
</manifest>

 

Android Shortcut操作(一)
http://www.eoeandroid.com/thread-92125-1-1.html

 Android Shortcut操作(二)
http://www.eoeandroid.com/thread-92128-1-1.html
posted @ 2012-04-01 13:34 雪山飞鹄 阅读(1933) | 评论 (1)编辑 收藏

  1. 单台Linux服务器中如何部署多个独立应用,即多个应用不能run在一个jboss实例中?
    换言之,这个问题也可以这样描述:在单台Linux服务器中服务启动多个Jboss实例?
    默认情况下,jboss启动时加载server/default/目录下的配置,要实现多个实例的启动,主要是解决端口冲突的问题,因为一套端口只能被一个应用占有;
    一般来说,我们可以在Jboss启动时通过-Djboss.server.home设置当前实例启动时加载不同的目录来实现;
    比如Jboss主程序安装在/usr/xx/jboss/,应用放在/home/admin/app/;那此时就可以cp一份default目录到当前应用app目录下,通过-Djboss.server.home=/home/admin/app/default来启动该实例;
    若直接在/usr/xx/jboss/server/下复制default目录并改名为yy,则可以用更简单的参数-c yy来启动;
    对于多应用的情况,我们仍然要解决端口冲突的问题,有两种方式:
    其一,直接修改各应用对应的default目录下的所有配置端口,主要涉及配置文件conf/jboss-service.xml、tomcat下的server.xml;该方法比较土,很容易出错,因为端口众多,只要有一项端口没有改,jboss就将无法正常启动;若应用较少,比如就只有2个,那这种方式勉强可以用用;
    其二,在jboss-service.xml中启用jboss.system:service=ServiceBindingManager这个mbean服务,设置ServerName、StoreURL属性;将各套应用对应的端口全部配置在同一个文件中;推荐采用该方案,具体可参考:

  1. <mbean code="org.jboss.services.binding.ServiceBindingManager" 
  2.   name="jboss.system:service=ServiceBindingManager"> 
  3.   <attribute name="ServerName">ports-01</attribute> 
  4.   <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute> 
  5.   <attribute name="StoreFactoryClassName"> 
  6.     org.jboss.services.binding.XMLServicesStoreFactory 
  7.   </attribute> 
  8. </mbean> 

 

  • Jboss无法正常启动,报异常javax.management.MBeanRegistrationException: preRegister() failed?
    一般来说,上面的异常出现在4.2及其以后的版本中,比较详细的异常如下:
    1. javax.management.MBeanRegistrationException: preRegister() failed: [ObjectName='jboss.remoting:service=NetworkRegistry', Class=org.jboss.remoting.network.NetworkRegistry (org.jboss.remoting.network.NetworkRegistry@16b6c55)] 
    2.         at org.jboss.mx.server.registry.BasicMBeanRegistry.invokePreRegister(BasicMBeanRegistry.java:713
    3.         at org.jboss.mx.server.registry.BasicMBeanRegistry.registerMBean(BasicMBeanRegistry.java:211
    4.         at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    5.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25
    6.         at java.lang.reflect.Method.invoke(Method.java:585
    7.         at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155
    8.         ... 51 more 
    9. Caused by: java.lang.RuntimeException: Exception creating identity: mall_dev4: mall_dev4 
    10.         at org.jboss.remoting.ident.Identity.get(Identity.java:211
    11.         at org.jboss.remoting.network.NetworkRegistry.preRegister(NetworkRegistry.java:268
    12.         at org.jboss.mx.server.AbstractMBeanInvoker.invokePreRegister(AbstractMBeanInvoker.java:966
    13.         at org.jboss.mx.modelmbean.ModelMBeanInvoker.invokePreRegister(ModelMBeanInvoker.java:489
    14.         at org.jboss.mx.server.AbstractMBeanInvoker.preRegister(AbstractMBeanInvoker.java:654
    15.         at org.jboss.mx.server.registry.BasicMBeanRegistry.invokePreRegister(BasicMBeanRegistry.java:697
    16.         ... 56 more 

    这主要是因为Jboss启动了一个jboss.remoting:service=NetworkRegistry的mbean服务,启动时却又无法根据当前hostname找到IP!
    解决方案为在/etc/hosts中绑定当前服务器的主机名和IP,比如10.2.224.214 mall_dev4;
    对于4.2系列之前的版本,如果没有绑定主机名和IP,虽然会出现以下的异常,但并不一定会影响应用的正常启动;
    1. 11:32:12,427 WARN  [ServiceController] Problem starting service jboss:service=invoker,type=http 
    2. java.net.UnknownHostException: mall_dev4: mall_dev4 
    3.         at java.net.InetAddress.getLocalHost(InetAddress.java:1308
    4.         at org.jboss.invocation.http.server.HttpInvoker.checkInvokerURL(HttpInvoker.java:204
    5.         at org.jboss.invocation.http.server.HttpInvoker.startService(HttpInvoker.java:101
    6.         at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289
    7.         at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245
    8.         at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
    9.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25
    10.         at java.lang.reflect.Method.invoke(Method.java:585
    11.         at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155
    12.         at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94
    13.         at org.jboss.mx.server.Invocation.invoke(Invocation.java:86
    14.         at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264
    15.         at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659
    16.         at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978
    17.         at $Proxy0.start(Unknown Source) 
    18.         at org.jboss.system.ServiceController.start(ServiceController.java:417
  • Jboss已经正常启动,但是无法用IP或者绑定IP访问应用?
    熟悉Linux相关知识的筒靴都知道一个端口是绑定在某个地址上的,可以是一个,也可以是多个,一个端口在同一个地址上不能被两个应用占有;
    出现这个问题一般是因为你使用的是4.2系列及其之后的版本,因为从这个系列开始,Jboss默认绑定的端口由之前的0.0.0.0变成了127.0.0.1;前者表示绑定当前服务器下所有地址,包括自身的IP、127.0.0.1;而后者只绑定了127.0.0.1,而没有绑定本机IP,通过IP去访问应用自然也就无法成功了,因为访问的IP地址没有开放对应的端口;
    对于默认的这种情况,一般来说jboss是要和apache搭配使用的,apache暴露应用外部访问的端口,然后apache再监听本地(也就是127.0.0.1)的端口;
    当然这个默认配置也是可以修改的,方式也比较多,比如:
    方式1,启动脚本中通过参数-b, --host=<host or ip>指定地址,比如-b 0.0.0.0就表示绑定所有地址;
    方式2,启动脚本中通过参数-Djboss.bind.address指定地址,比如-Djboss.bind.address=0.0.0.0;
    方式3,直接修改需要对外暴露的端口绑定地址,比如tomcat/server.xml中的http端口绑定address信息;
  • Jboss正常启动,但是用shutdown脚本无法关闭应用?
    对于jboss的关闭,shutdown命令允许好几种方式的关闭,可以参考该命令的帮助:
    1. usage: shutdown [options] <operation> 
    2. options: 
    3.     -h, --help                Show this help message (default
    4.     -D<name>[=<value>]        Set a system property 
    5.     --                        Stop processing options 
    6.     -s, --server=<url>        Specify the JNDI URL of the remote server 
    7.     -n, --serverName=<url>    Specify the JMX name of the ServerImpl 
    8.     -a, --adapter=<name>      Specify JNDI name of the MBeanServerConnection to use 
    9.     -u, --user=<name>         Specify the username for authentication 
    10.     -p, --password=<name>     Specify the password for authentication 
    11. operations: 
    12.     -S, --shutdown            Shutdown the server 
    13.     -e, --exit=<code>         Force the VM to exit with a status code 
    14.     -H, --halt=<code>         Force the VM to halt with a status code 
    一般来说,我们使用-s参数来关闭,也即通过JNDI URL;
    若是基于JNDI URL的方式出现这种情况一般有三种可能:
    其一,当前应用所使用的default目录内的内容与当前运行jboss自身的default内容不一致,比如当前jboss版本为4.0.5,而启动时指定的default却是从jboss 4.2.1中cp过来的;这种情况在搭建环境时经常出现,因为一般直接从另外一台linux服务器中scp过来,但其实两台服务器自身安装的jboss版本不一致;
    其二,shutdown命令中指定的JNDI端口与实际应用启动的JNDI端口不一致
    其三,/etc/hosts中对当前主机名绑定的IP地址不正确,比如当前服务器实际的IP地址为10.2.224.214,而hosts中绑定的却是10.0.0.1;
    总之,出现此类情况都是因为jboss自身无法正确接收到正确的关闭命令所致,一般来说在jboss的server.log中会抛如下的异常信息:
    1. Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.ConnectException: Connection refused to host: 10.0.0.1; nested exception is:  
    2.         java.net.ConnectException: Connection timed out]  
    3.         at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:707)  
    4.         at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)  
    5.         at javax.naming.InitialContext.lookup(InitialContext.java:351)  
    6.         at org.jboss.Shutdown.main(Shutdown.java:202)  
    7. Caused by: java.rmi.ConnectException: Connection refused to host: 10.0.0.1; nested exception is:  
    8.         java.net.ConnectException: Connection timed out  
    9.         at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)  
    10.         at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)  
    11.         at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)  
    12.         at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)  
    13.         at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)  
    14.         at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)  
    15.         ... 3 more  
  • 如何对Linux下的Jboss应用进行debug?
    其实这个问题和Jboss是否部署在Linux下没有直接关系,可以在jboss启动时指定远程debug端口即可,比如:
    1. -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n 

    然后在eclipse中新建remote debug时指定对应的端口即可;

  • Linux下Jboss启动、关闭、端口配置等常见问题FAQ 
    关于JBOSS端口被占用的问题
    posted @ 2012-03-28 10:58 雪山飞鹄 阅读(5394) | 评论 (0)编辑 收藏