Ejb中jar war ear的理解和Local和remote的理解(一)

EJB3+Struts2+JPA 开发实践
本文介绍了使用EJB3、Struts2和JPA技术进行分布式开发的经验,重点讨论了不同类型的文件(jar、war、ear)在JBoss环境下的作用及session bean和entity bean之间的本地与远程调用区别。
这半年来公司一直在用EJB3+strust2+JPA进行开发...使用Jboss作为服务器的分布式开发。这里对ejb进行一些了解总结
1.jar,war,ear
1.1 Jar文件 (扩展名为. Jar)我们进行使用一些框架还有java包都是jar后缀的.它存放的是一些可以使.class文件.资源(resources)、辅助文件(auxiliary files)、
配置文件(xml等).主要是提供别人便捷!
JBOSS环境下:当我们使用Myeclipse建立一个ejb项目的时候.它add deployment进行jboss的时候就会产生一个.jar的文件..这就是一个可以进行远程和本地调用的ejb项目.
我们一般将各个功能部分进行代码的分拆然后产生多个ejb jar项目.再使用ant将他们的接口进行打包给予别的项目进行调用.这样便于以后的分布式开发


1.2 War文件(扩展名为.War)使用tomcat开发过的和下载一些网上的源码在tomcat运行过的就知道web应用的后缀名为war..一般定制成这样的格式是方便管理...一个Web应用程序被定义为单独的一组文件、类和资源,用户可以对jar文件进行封装,并把它作为小型服务程序(servlet)来访问。
我们最常使用建立一个web项目然后导进一些框架包(如shh的框架jar包)。然后对这些jar包的类进行调用完成我们项目开发.
JBOSS环境下:当我们使用Myeclipse建立一个web项目的时候.它add deployment进行jboss的时候就会产生一个.war的文件..如何一个.war中servlet需要使用同在JBoss下的ejb项目需要使用remote来进行调用(虽然在同一个Jboss环境下.反正web应用对Jar的调用都要是有remote接口...)

1.3 Ear文件(扩展名为.Ear)包含全部企业应用程序。在这种情形下,一个企业应用程序被定义为多个jar文件、资源、类和Web应用程序的集合。(一般我们完成开发后会将ejb的jar项目和相应的web项目使用ant进行打包成ear方便部署)

2.local和remote的区别
在一个ejb项目中.session bean和entity bean之间调用使用的是local接口.
@Local({ContentMgr.class})--标志bean可以进行本地调用
@Remote({ContentMgr.class})--标志bean可以进行远程调用
由于remote接口对性能的影响很大.所以我们在能使用Local进行调用的时候尽量使用local
这里使用本地调用方式有2种
1.


Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext context = new InitialContext(props);
RankDao rankDao = (RankDao)context.lookup("RankDaoImpl/local");

2.使用@EJB(beanName="RankDaoImpl")

以上是一些暂时小总结.有时间再进行详细点的整理
#!/bin/bash # 发包工具 --2025-11-08 # 功能:根据file_list提供的需发包的文件名称,在四个正式包目录中查找文件,EJB子目录优先查找,查找到文件后,对正式包的文件备份并替换新文件。 #备份文件夹为当天日期的文件夹,并根据正式包的目录生成对应的ant命令,存放在指定目录 # 下载包的目录 SOURCE_DIR="/root/a" #需发包的文件名 FILE_LIST="file_list.txt" #生成的发包ant命令 OUTPUT_FILE="11.txt" # 创建正式包的备份目录 backup_dir="backup_$(date '+%Y%m%d')" mkdir -p "$backup_dir" # EJB子目录与构建文件的映射 declare -A EJB_MAPPING=( ["LkmAgvEjbs.ear"]="agv.xml" ["LkmBiEjbs.ear"]="bi.xml" ["LkmBoardEjbs.ear"]="board.xml" ["LkmCommonEjbs.ear"]="commejb.xml" ["LkmConvertEjbs.ear"]="convert.xml" ["LkmDataSwitch.ear"]="dataswitch.xml" ["LkmDatatransfer.ear"]="datatrans.xml" ["LkmFopEjbs.ear"]="fopejb.xml" ["LkmJmsEjbs.ear"]="jmsejb.xml" ["LkmMachineEjbs.ear"]="machine.xml" ["LkmNcEjbs.ear"]="ncejb.xml" ["LkmOrderEjbs.ear"]="order.xml" ["LkmPlatformEjbs.ear"]="platform.xml" ["LkmPoiEjbs.ear"]="poiejb.xml" ["LkmPrintEjbs.ear"]="print.xml" ["LkmProgramEjbs.ear"]="program.xml" ["LkmQcEjbs.ear"]="qc.xml" ["LkmQuoteEjbs.ear"]="quoteejb.xml" ["LkmToolEjbs.ear"]="tool.xml" ["LkmUmsEjbs.ear"]="umsejb.xml" ["WorkTimeEjbs.ear"]="worktime.xml" ) # 主目录与构建文件的映射 declare -A MAIN_MAPPING=( ["jsf_apps"]="pmi.xml" ["restful_apps"]="rest.xml" ["shared_library"]="remote.xml" ) # 检查前置条件 check_prerequisites() { if [ ! -f "$FILE_LIST" ]; then echo "错误: 文件列表 $FILE_LIST 不存在" exit 1 fi if [ ! -d "$SOURCE_DIR" ]; then echo "错误: 源目录 $SOURCE_DIR 不存在" exit 1 fi } # 生成Ant命令 generate_ant_command() { local filename="$1" local location="$2" case "$location" in ejb_apps/LkmAgvEjbs.ear) echo "ant -f agv.xml -Djar=$filename" ;; ejb_apps/LkmBiEjbs.ear) echo "ant -f bi.xml -Djar=$filename" ;; ejb_apps/LkmBoardEjbs.ear) echo "ant -f board.xml -Djar=$filename" ;; ejb_apps/LkmCommonEjbs.ear) echo "ant -f commejb.xml -Djar=$filename" ;; ejb_apps/LkmConvertEjbs.ear) echo "ant -f convert.xml -Djar=$filename" ;; ejb_apps/LkmDataSwitch.ear) echo "ant -f dataswitch.xml -Djar=$filename" ;; ejb_apps/LkmDatatransfer.ear) echo "ant -f datatrans.xml -Djar=$filename" ;; ejb_apps/LkmFopEjbs.ear) echo "ant -f fopejb.xml -Djar=$filename" ;; ejb_apps/LkmJmsEjbs.ear) echo "ant -f jmsejb.xml -Djar=$filename" ;; ejb_apps/LkmMachineEjbs.ear) echo "ant -f machine.xml -Djar=$filename" ;; ejb_apps/LkmNcEjbs.ear) echo "ant -f ncejb.xml -Djar=$filename" ;; ejb_apps/LkmOrderEjbs.ear) echo "ant -f order.xml -Djar=$filename" ;; ejb_apps/LkmPlatformEjbs.ear) echo "ant -f platform.xml -Djar=$filename" ;; ejb_apps/LkmPoiEjbs.ear) echo "ant -f poiejb.xml -Djar=$filename" ;; ejb_apps/LkmPrintEjbs.ear) echo "ant -f print.xml -Djar=$filename" ;; ejb_apps/LkmProgramEjbs.ear) echo "ant -f program.xml -Djar=$filename" ;; ejb_apps/LkmQcEjbs.ear) echo "ant -f qc.xml -Djar=$filename" ;; ejb_apps/LkmQuoteEjbs.ear) echo "ant -f quoteejb.xml -Djar=$filename" ;; ejb_apps/LkmToolEjbs.ear) echo "ant -f tool.xml -Djar=$filename" ;; ejb_apps/LkmUmsEjbs.ear) echo "ant -f umsejb.xml -Djar=$filename" ;; ejb_apps/WorkTimeEjbs.ear) echo "ant -f worktime.xml -Djar=$filename" ;; jsf_apps) echo "ant -f pmi.xml -Djar=$filename" ;; restful_apps) echo "ant -f rest.xml -Djar=$filename" ;; shared_library) echo "ant -f remote.xml -Djar=$filename" ;; *) echo "# 未知位置: $location" ;; esac } # 同步单个文件 sync_single_file() { local filename="$1" local source_file="$SOURCE_DIR/$filename" echo "处理文件: $filename" local ant_commands=() local found_in_ejb=false # 优先在EJB子目录中查找(限制深度2层) for subdir in "${!EJB_MAPPING[@]}"; do local target_path="ejb_apps/$subdir/$filename" if [ -f "$target_path" ]; then # 备份原文件 cp "$target_path" "$backup_dir/" 2>/dev/null # 覆盖文件 cp "$source_file" "$target_path" ant_commands+=("$(generate_ant_command "$filename" "ejb_apps/$subdir")") echo " ✓ 已覆盖到: ejb_apps/$subdir" found_in_ejb=true fi done # 如果在EJB子目录中没找到,再在jsf目录中查找(限制深度2层) if [ "$found_in_ejb" = false ]; then for maindir in "${!MAIN_MAPPING[@]}"; do local target_path="jsf_apps/LkmPmi.ear/LkmPmi.war/WEB-INF/lib/$filename" if [ -f "$target_path" ]; then # 备份原文件 cp "$target_path" "$backup_dir/" 2>/dev/null # 覆盖文件 cp "$source_file" "$target_path" ant_commands+=("$(generate_ant_command "$filename" "$maindir")") echo " ✓ 已覆盖到: $maindir" found_in_ejb=true fi done fi # 如果在jsf目录中没找到,再在restful目录中查找(限制深度2层) if [ "$found_in_ejb" = false ]; then for maindir in "${!MAIN_MAPPING[@]}"; do local target_path="restful_apps/LkmRestful.ear/LkmRestful.war/WEB-INF/lib/$filename" if [ -f "$target_path" ]; then # 备份原文件 cp "$target_path" "$backup_dir/" 2>/dev/null # 覆盖文件 cp "$source_file" "$target_path" ant_commands+=("$(generate_ant_command "$filename" "$maindir")") echo " ✓ 已覆盖到: $maindir" found_in_ejb=true fi done fi # 如果在restful目录中没找到,再在shared_library目录中查找(限制深度2层) if [ "$found_in_ejb" = false ]; then for maindir in "${!MAIN_MAPPING[@]}"; do local target_path="shared_library/lkm.ejb.remote.ear/APP-INF\lib/$filename" if [ -f "$target_path" ]; then # 备份原文件 cp "$target_path" "$backup_dir/" 2>/dev/null # 覆盖文件 cp "$source_file" "$target_path" ant_commands+=("$(generate_ant_command "$filename" "$maindir")") echo " ✓ 已覆盖到: $maindir" fi done fi # 将生成的Ant命令写入11.txt for cmd in "${ant_commands[@]}"; do echo "$cmd" >> "$OUTPUT_FILE" done if [ ${#ant_commands[@]} -eq 0 ]; then echo " ❌ 未找到在四个目录中" else echo " ✅ 生成 ${#ant_commands[@]} 个构建命令" fi echo "----------------------------------------" } # 主函数 main() { check_prerequisites # 清空输出文件 > "$OUTPUT_FILE" echo "开始增强版文件同步任务(目录深度限制: 2层)" echo "源目录: $SOURCE_DIR" echo "" local total_files=0 # 读取文件列表并处理 while IFS= read -r filename; do if [[ -z "$filename" || "$filename" =~ ^# ]]; then continue fi filename=$(echo "$filename" | tr -d '\r' | xargs) ((total_files++)) sync_single_file "$filename" echo "" done < "$FILE_LIST" echo "========================================" echo "增强版同步任务完成!" echo "处理文件数: $total_files" echo "构建命令已保存到: $OUTPUT_FILE" } main "$@" <code_end> 分析优化
最新发布
11-19
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值