WildFly(Jboss8)部署程序中的一些问题及解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/syf121/article/details/84705014
WildFly中自带了slf4j、cxf2.x,所以在部署之后要不log不起作用,要不启动不了,解决办法是WildFly的配置文件tandalone\configuration\standalone.xml中去掉
<extension module="org.jboss.as.logging"/>
<extension module="org.jboss.as.webservices"/>
及相关配置

还有一种方式在程序的WEB-INF下新建jboss-deployment-structure.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.slf4j.jcl-over-slf4j" />
<module name="org.slf4j.ext" />
<module name="org.apache.cxf" />
<module name="org.apache.cxf.impl" />
</exclusions>
</deployment>
</jboss-deployment-structure>

理论上可行,但是本人实际中未起作用
展开阅读全文

打印中一些问题解决方法 (taogou)

01-13

打印中一些问题的解决方法 (taogou)rn以下quickrpt版本都为3.6rnrnrn关于自动折行 rn需求:将超过长度的文本自动折行rn解决方法:根据DELPHI的判断函数来控制超过长度文本的取舍,其实它本身有判断并截取中文字符的功能,rn但是只取了第一行,所以就没有折行的效果。rn源码:文件 QRCtrls;函数 FormatLines;子函数AddWordrnrnprocedure AddWord(aWord : string);rn$ifdef ver100rn varrn S: string;rn$endifrn beginrn while aLineWidth(NewLine + aWord) > Width do //字符长度超过指定长度rn beginrn if NewLine = '' thenrn beginrn$ifdef ver100 //版本控制 似乎只分了$ifdef VER36 和这个。rn if SysLocale.FarEast thenrn beginrn while true dorn beginrn if (aWord[1] in LeadBytes) and (Length(aWord) > 1) then rn S := copy(aWord, 1, 2)rn elsern S := copy(aWord, 1, 1);rnrn if aLineWidth(NewLine + S) < Width thenrn beginrn NewLine := NewLine + S;rn Delete(aWord, 1, Length(S));rn endrn elsern Break;rn end;rn endrn elsern while aLineWidth(NewLine + copy(aWord, 1, 1)) < Width dorn beginrn NewLine := NewLine + copy(aWord, 1, 1);rn Delete(aWord, 1, 1);rn end;rn$elsern while aLineWidth(NewLine + copy(aWord, 1, 1)) <= Width dorn beginrn if ByteType(aWord, Length(aWord)) = mbTrailByte then //如果是是双字节字符,则截两位rn //如果截的是双字节字符而长度恰好又超过了指定长度,rn //系统默认将指定长度扩展一位。如果不愿意,当然这里也可以自己再加入控制 rn begin rn NewLine:=NewLine +copy(aWord,1,2); rn Delete(aWord, 1, 2);rn end elsern beginrn NewLine := NewLine + copy(aWord, 1, 1);rn Delete(aWord, 1, 1);rn end;rn end;rn$endifrn//taogou aWord := ''; //该句的赋值就将导致不能换行rn end;rn FlushLine; //将截取的指定长度的字符加入到字符串列表中rn if aLineWidth(aWord) > Width then rn beginrn if NewLine = '' thenrn beginrn if Width = 0 thenrn aWord := ''rn elsern while aLineWidth(aWord) > Width dorn$ifdef ver100rn if ByteType(aWord, Length(aWord)) = mbTrailByte thenrn Delete(aWord, Length(aWord)-1, 2)rn elsern//$endifrn beginrn Delete(aWord, Length(aWord), 1);rn end;rn end;rn NewLine := aWord;rn FlushLine;rn aWord := '';rn end;rn if not WordWrap thenrn beginrn aWord := '';rn LineFinished := true;rn end;rn end;rn NewLine := NewLine + aWord;rn end;rnrnrn关于自动折行所引起的页行数可变控制rnrn需求:文本折行后,是已设格式的行高自动变化,行数不容易控制,预览效果不堪入目。rn解决方法:不允许已设行高自动变化,根据detail行高取舍文本的行数。例:不折行的情况下打印5行的固定rn格式,会因为折行而打不了5行,程序自动将行高增大,在套打的情况下,情况非常糟糕。所以强制固定行高,rn如果折行超过了固定高度,则超出部分不打印。rnrn源码:文件 QRCtrls;主函数 PrintToCanvas;子函数CanPrintrnrn找到下面着一行rn TQRCustomBand(Parent).ExpandBand(LineHeight, AFExpanded, HasExpanded); rn该行是根据你的CAPTION的行数来增加行数的,所以屏蔽掉rn 在主函数中找到下面这一行rn ControlBottom := aTop + aHeight +1;rn修改为rn ControlBottom := aTop + TQRCustomBand(Parent).size.Length +1;rn TQRCustomBand(Parent).size.Length 是当前DETAIL的行高rnrn 然后找到下面这个循环rn while (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint do rn if (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint thenrn beginrn PrintLine(FCurrentLine);rn inc(FCurrentLine);rn end;rn 修改为rn while (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint do //taogourn if (FCurrentLine <= FFormattedLines.Count - 1) and CanPrint thenrn beginrn if Y + LineHeight < ControlBottom then //taogou Y为当前开始打印的位置,lineHeight为字符行高rn PrintLine(FCurrentLine); //controlbottom为detail的下限位置,仅当位置小于允许的位置才打印 rn inc(FCurrentLine);rn end;rn FCurrentLine:=FFormattedLines.Count; //不管打了几行,都将当前行表示为该caption已经打印完毕rnrnrn需求:控制多余行数,例:页打印行数为5行,当前打印记录数为12,带格式不套打,rn则在最后页只有2行数据,从第3行到页脚为一片空白。这里需要将最后一页上3行打印上无数据的空格式.rn解决方法:循环N次detail行的打印方法,并屏蔽掉记录rnrn源码:文件 QuickRpt;主函数 TQRController.Executernrnrn HasPrintedLines:=0; //新增本函数局部变量 记录已经打印的行数rn while MoreData dorn beginrn inc(HasPrintedLines); //增1rn Application.ProcessMessages;rn if ParentReport.QRPrinter.Cancelled thenrn Exit;rn if ParentReport.PreparingDesignTime and (ParentReport.FPageCount > 1) then Exit;rn inc(FDetailNumber);rn PrintGroupHeaders;rn PrintBeforeControllers;rn ParentReport.PrintBand(FDetail);rn PrintAfterControllers;rn if DSOK thenrn beginrn DataSet.Next;rn MoreData := not FDataSet.Eof;rn if (FDataSet.Eof) then //Add beginrn beginrn if FDetail<>nil then //将detail中的TQRDBText and TQRLabel 全部不打rn for j:=0 to FDetail.ControlCount-1 dorn beginrn if FDetail.Controls[j] is TQRDBText thenrn TQRDBText(FDetail.Controls[j]).Enabled:=False;rn if FDetail.Controls[j] is TQRLabel thenrn TQRLabel(FDetail.Controls[j]).Caption:='';rn end;rn for j:=1 to FPageMaxLines*ParentReport.PageNumber-HasPrintedLines do rn // FPageMaxLines 页最大打印行数,外部传进来的变量 rn //ParentReport.PageNumber 总共打印的页数,因为只对最后一页进行控制,rn //所以当前的打印页数已经确定,可以直接取rn begin rn Application.ProcessMessages; //begin 1rn if ParentReport.QRPrinter.Cancelled then Exit;rn PrintGroupHeaders;rn PrintBeforeControllers;rn if assigned(FDetail) then FDetail.MakeSpace;rn NotifyClients(qrMasterDataAdvance);rn ParentReport.PrintBand(FDetail); rn PrintAfterControllers; //end 1 rn //从begin 1到这里的函数是直接COPY自2.0版本上的打印(此处应该有更加好的解决方法,rn //偶只是懒了一下,:) ) 其实这段用在2.0中也是没有问题DIrn end; //Add endrn endrnrn end elsern beginrn MoreData := false;rn if assigned(FOnNeedDataEvent) and not (csDesigning in ComponentState) thenrn OnNeedData(SelfCheck, MoreData);rn end;rn if CheckGroups thenrn beginrn if DSOK thenrn DataSet.Prior;rn PrintGroupFooters;rn if DSOK thenrn DataSet.Next;rn end;rn if ParentReport is TQuickRep andrn DSOK and (TQuickRep(ParentReport).DataSet = DataSet) and (RecCount <> 0) thenrn ParentReport.QRPrinter.Progress := (Longint(DetailNumber) * 100) div RecCount;rn end;rnrnrn注:第一次写这样的东东和大家共享,感觉有点力不从心。原因?太明显了,1、不知道格式该怎么定义rn2、不知道怎么写注解 3、我的文笔又很懒 4、不知道MM是否在想我呢???:)rnrnOK,本次东东就东到这里,同志们,好东西拿出来共享吧rn 论坛

VS2008程序部署终极解决方法

10-06

此文来源于我的个人网站,在这里编辑图片感觉非常吃力,有兴趣阅读图文完整版请移步到[url=http://beke165.com/?r=technology/browser&id=151]这里[/url]。rnrn缘起,本文也是在参考其他网文的基础上加上自己的实际操作验证完成的,应用程序配置不正确这个问题让人非常之头疼加上觉得他们写得不够详细,但是可能会有的读者不能正确操作而放弃,所有有了此文。 rnrnVC2005以上环境下编译好的可执行程序发布时,在未配置VC2008或VC2005的环境下运行.经常有"应用程序配置不正确,程序无法启动"这样的问题.rnrn解决这类问题常用方法就是采用MT过MTd选项静态链接运行库,其实就是将运行库静态编译到exe中或者安装redist包。这种方法有许多弊端:rnrn1.exe的体积会大不少。rnrn2.exe如果调用第三方dll或静态库,编译时候也必须采用MT过MTd选项。不然会编译不过,调用的第三方DLL会出现各种各样的内存问题。rnrn3.安装redist包有点麻烦,还有可能遇到版本问题,比如VS2008和VS2008SP1要分别安装。rnrn下面介绍怎么在使用MD或者MDd选项(在此我们只讨论release版本,debug版本一般不用于发布,操作也是一样的)时把需要的运行库随exe一起部署的终极解决方法。rnrn第一步:将嵌入清单选择为否,然后编译,会在exe所在的Release目录生成程序名+exe.manifest文件。rn第二步:将第一步所生成的程序名+exe.manifest文件打开,删除其中的publicKeyToken,Microsoft.Windows.Common-Controls对应项不要删,我的VS2008删除后如下所示:rnrnrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrn第三步:将VS2008发布目录下(如果VS安装在D盘的话,为D:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86,其他类推)的manifest包含的运行库拷贝到exe所在的Release目录(本例子需要拷贝的目录为Microsoft.VC90.CRT和Microsoft.VC90.MFC)。rnrnrnrnrnrn第四步:至此我们的发布目录包含的文件和件夹如下,接下来解决版本问题(这一步非常关键,参考文章讲得有点模糊),其实很简单,用文本编辑器打开Microsoft.VC90.CRT和Microsoft.VC90.MFC文件夹中的Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest两个文件,首先删除这两个文件中的publicKeyToken,然后将其中version字段改成和程序名+exe.manifest对应version字段一样。如本例子Microsoft.VC90.CRT.manifest的version字段需要改成9.0.21022.8,Microsoft.VC90.MFC.manifest的version字段也需要改成9.0.21022.8。rnrnrnrn第五步:至此我们的程序已经可以发布了(把Release目录下的文件打包发布即可),如果您嫌麻烦可以不用往下看了。其实我们可以把程序名+exe.manifest这个文件嵌入到exe里面去,这个样发布程序时就少了一个看着碍眼的清单文件。为了使用外部清单文件,首先必须把生成清单文件关闭,如下图所示:rnrnrnrn第六步:接下来我们把Release目录生成程序名+exe.manifest嵌入到exe中去,如下图所示,注意我们又把嵌入清单改回来了。rnrnrnrn第7步:重新编译,在输出里面得知清单文件嵌入到exe里面去了如下。至此我们发布程序时已经可以不要Release目录生成程序名+exe.manifest这个文件。rnrn1>------ 已启动生成: 项目: TestManifest, 配置: Release Win32 ------rnrn1>正在链接...rnrn1>正在生成代码rnrn1>已完成代码的生成rnrn1>正在嵌入清单...rnrn第8步:到此结束,什么?还有人怀疑程序运行后是不是调用exe目录下Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest中的运行库(因为暂时找不到一个干净的系统测试)。我们可以这样做,运行exe后,把exe目录下Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest中的dll文件改名,或删除(最好拿msvcr90.dll开刀,其他的可能exe不会调用到),如果被调用,是无法改名和删除的。rnrn第9步:如实确实删不掉或者无法改名,证明dll确实被调用了。但是还有较真的或强迫症患者(出门老是怕忘记锁门),那就只有拷贝到一个干净的系统测试了,还有一招就是用Unlocker查询dll被哪个exe占用,入下图:rnrnrn至此本文结束,下面附上参考资料:rnrnhttp://blog.kalmbach-software.de/2008/05/03/howto-deploy-vc2008-apps-without-installing-vcredist_x86exe/rnhttp://blog.163.com/smart_84@126/blog/static/6657573520104251007316/rnrnrn 论坛

没有更多推荐了,返回首页