简而言之:使用Intellij Idea(9)和Git的最佳实践是什么?
上下文
我们最近升级到Intellij创意版本9,并开始使用Git在现有项目上使用新功能.
我们主要使用git命令行来更好地学习该工具.但是我们认为我们会选择蜂巢头脑来找出git最佳实践的想法.
Idea UI与CVS和Git类似,但底层实现略有不同.
示例问题
例如: - 使用CVS,当我们有多个产品版本时,我们每个人都会拥有1-0,2-0,3-0等分支的本地副本,每个分支都有自己的Intellij文件(即.ipr,.iws等)."git方式"似乎有一个项目并使用'git branch'来切换分支.这很好,但是当你改变分支时,它会为想法创造巨大的开销(因为它必须重新加载每个已更改的文件,包括签入的jar).那么:你们每个"主要版本"还有一个单独的项目(.git),或者有一个项目并使用"git branch"吗?
- 使用Autostash是个好主意吗?
- 您是否自动将每个修改添加到您的git提交?或者稍后使用"git add"?
你有什么变化吗?
- 合并的最佳方式?
- 任何其他提示/提示/为你工作的东西等.
最后评论
我们仍然"在cvs中思考",所以这部分习惯于git; 部分已经习惯了Idea的Ui for git.
这些是相当基本的问题,因为我们仍然主要使用命令行.另外我听说10有更好/更强/更快的git集成工具
谢谢
PowerShell相当于'less'是什么?
我看到'更多',但它缺乏我依赖的一些功能(例如搜索文件)
我寻找一个寻呼机(相当于'少'),它允许一次搜索(匹配或忽略大小写),多个文件等.
我们的一些服务器运行Windows 2008,我缺乏安装cygwin的管理员权限
我听过Windows 2008,MSFT一起行动并提供了一些易于管理的工具.
更新:
我应该给出一些背景信息:
谢谢
垃圾收集日志中的"Full GC(System)"条目是什么意思?那个类叫System.gc()?
我的垃圾收集日志有两个不同的"完整gc"条目类型?一个用'System'这个词,另一个没有.有什么不同?
(更新:我搜索了这个词并没有找到明确的答案,只有几个问题.所以我想我会发布它).
系统:
164638.058:[全GC (系统) [PSYoungGen:22789K-> 0K(992448K)] [PSOldGen:1645508K-> 1666990K(2097152K)] 1668298K-> 1666990K(3089600K)[PSPermGen:164914K-> 164914K(166720K)],5.7499132 secs] [次:用户= 5.69 sys = 0.06,真= 5.75秒]
无系统:
166687.013:[Full GC [PSYoungGen:126501K-> 0K(922048K)] [PSOldGen:2063794K-> 1598637K(2097152K)] 2190295K-> 1598637K(3019200K)[PSPermGen:165840K-> 164249K(166016K)],6.8204928 secs] [时间:用户= 6.80 sys = 0.02,真实= 6.81秒]
GC选项
我们与gc相关的java内存选项是:-Xloggc:../ server/pe/log/jvm_gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails
我们没有'-XX:+ DisableExplicitGC',所以有些错误的类可能会调用System.gc()
fwiw,我们完整的jvm选项:
-Xms3072m -Xmx3072m -XX:+ HeapDumpOnOutOfMemoryError -XX:-UseGCOverheadLimit -Xloggc:../ server/pe/log/jvm_gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -XX:MaxPermSize = 256m -XX:+ UseCompressedOops
提前致谢,
将
是否有任何工具允许.hprof文件的离线分析(包括摘要/排序/筛选)?或者你可以在批处理模式下运行VisualVM,hat等吗?
我对可以输入.hprof文件,处理它并生成报告的内容感兴趣.
我假设您需要传递一系列选项来配置报告,所以如果您知道任何有用的提示,请称重.
最好是可编写脚本的,这样我就可以一次运行一堆.
我有这个朋友......
我有这个朋友谁在2000年初开始的java ee应用程序(j2ee)应用程序上工作.目前,他们在这里和那里添加了一个功能,但是有一个很大的代码库.多年来,该团队缩减了70%.
[是的,"我有这个朋友".这是我,试图幽默地注入少年高中辅导员的耻辱]
Java,Vintage 2002
该应用程序使用EJB 2.1,struts 1.x,DAO等与直接jdbc调用(存储过程和预准备语句的混合).没有ORM.对于缓存,它们使用OpenSymphony OSCache和本地缓存层的混合.
在过去几年中,他们花了很多精力来使用ajax技术和库来实现UI的现代化.这主要涉及javascript库(jquery,yui等).
客户端
在客户端,缺少从struts1到struts2的升级路径阻碍了它们迁移到struts2.其他Web框架变得流行(wicket,spring,jsf).Struts2不是"明显的赢家".将所有现有的UI从Struts1迁移到Struts2/wicket /等似乎并没有以非常高的成本提供太多的边际收益.他们不希望拼凑出各种技术(如Struts2中的子系统X,Wicket中的子系统Y等),因此开发人员使用Struts 1编写新功能.
服务器端
在服务器端,他们考虑转向ejb 3,但从未有过大的推动力.开发人员都熟悉ejb-jar.xml,EJBHome,EJBRemote,"ejb 2.1原样"代表了阻力最小的路径.
关于ejb环境的一个大抱怨:程序员仍假装"ejb服务器在独立的jvm中运行而不是servlet引擎".没有任何应用服务器(jboss/weblogic)强制执行此分离.该团队从未在应用服务器的单独盒子上部署ejb服务器.
ear文件包含同一jar文件的多个副本; 一个用于'web层'(foo.war/WEB-INF/lib),另一个用于服务器端(foo.ear /).app服务器只加载一个jar.重复使得含糊不清.
高速缓存
至于缓存,它们使用多个缓存实现:OpenSymphony缓存和本地缓存.Jgroups提供群集支持
怎么办?
问题是:团队目前有多余的周期来投资现代化应用程序?聪明的投资者会在哪里花钱?
主要标准:
1)提高生产力.特别是减少了开发新子系统功能和减少维护的时间.2)性能/可扩展性.
他们不关心时尚或技术的街头信誉.
你们都推荐什么?
在持久性方面将
所有内容(或仅新开发)切换到JPA/JPA2?
直接冬眠?等待Java EE 6?
在客户端/ Web框架方面:将(部分或全部)迁移到struts2?便门?JSF/JSF2?
至于缓存: 兵马俑?的Ehcache?相干?坚持他们拥有的东西?如何最好地利用64位jvms提供的巨大堆大小?
提前致谢.
更新:这看起来像一个内存问题.一个3.8 Gb的Hprof文件表明,当发生"阻塞"时,JVM正在转储它的堆.我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例.我相信他们在堆转储完成之前关闭了网站.日志没有错误/异常/问题证据 - 可能是因为JVM在生成错误消息之前被杀死了.
原始问题我们最近出现了应用程序出现的情况 - 最终用户 - 要挂起.我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED.
在过去 过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待.2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases)
不寻常的数据 在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等.
问题 是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance?显然有些资源"稀缺",但哪些资源?
谢谢
将
堆栈跟踪摘录
http-0.0.0.0-80-417" daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000]
java.lang.Thread.State: BLOCKED (on object monitor)
at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630)
http-0.0.0.0-80-451" daemon prio=6 tid=0x000000000f184800 nid=0x14d4 waiting for monitor entry [0x000000003843d000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
"http-0.0.0.0-80-449" daemon prio=6 tid=0x000000000f17d000 nid=0x2240 waiting for monitor entry …Run Code Online (Sandbox Code Playgroud) java garbage-collection locking blocking concurrent-programming
上下文
我们希望使用"重播"Web服务器访问日志来生成负载测试.我想起了JMeter,因为我最近阅读了关于在云中使用jmeter的博客文章(例如,启动了一些Amazon EC2实例来生成负载)
多年来我听说过JMeter重播访问日志的能力,但在审查这个功能时,我发现了以下内容.
作用:
jsessionId令牌(认为它试图通过IP地址估计会话);才不是:
发布数据对于重新创建实际负载会有很长的路要走.
此外,该文档将访问日志采样器描述为"alpha代码",即使它已有8年历史.它似乎没有积极维护.(这比Gmail的测试版要长.)
HttpPerf
另一篇博客文章向我指出了httpperf工具.我已经开始阅读了它:
摘要
背景:云
我们有一个基于Java的Web应用程序,我们通常在自己的服务器上托管.最近,我们使用Amazon Web Services(AWS EC2)云来托管实例.
这种"云设置"与我们典型的"现场"设置相匹配:应用服务器的一台服务器,数据库服务器的另一台服务器.(多个应用服务器指向同一个数据库服务器)
问题 在这个云设置中,我们在数据库和jdbc驱动程序之间接收间歇性的"通过对等错误重置连接",其中(看似)随机间隔和代码库中的随机点,数据库连接失败.
以下是日志的一些错误摘录
堆栈跟踪示例1:
at com.participate.pe.genericdisplay.client.taglib.GenDisplayViewTag.doStartTag(GenDisplayViewTag.java:77)
... 75 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:304)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getMetaData(SQLServerConnection.java:1734)
at org.jboss.resource.adapter.jdbc.WrappedConnection.getMetaData(WrappedConnection.java:354)
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪示例2
at java.lang.Thread.run(Thread.java:619)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1532)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4437)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4389)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:1457)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:1462)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setAutoCommit(SQLServerConnection.java:1610)
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.checkTransaction(BaseWrapperManagedConnection.java:429)
Run Code Online (Sandbox Code Playgroud)
技术环境
有些观点
问题
-谁看过这个吗? …
摘要
如何让ant从相同的.class文件中重复生成与字节相同的jar文件?
背景
我们的构建过程执行以下操作:
注意:我们执行了最后一步,因此开发人员可以访问此jar文件,而无需自行构建.我们使用一个特殊的'derived'目录来区分源和工件.
问题
即使源文件没有改变,我们也无法获得生成字节相同的.jar文件的蚂蚁,即每个构建生成一个略有不同的jar(具有不同的MD5)
我检查了互联网,并在5年前找到了这个问题:
如果我使用ANT编译一些代码并创建一个jar和相关的md5文件,那么即使代码没有改变,md5文件中的校验和也是不同的.任何想法都是为什么它如此规避?我怀疑某处有一些时间戳信息.
http://www.velocityreviews.com/forums/t150783-creating-new-jar-same-code-different-md5.html
根据回复,我尝试了以下方法:
[注意:第二步似乎无效.见下文]
每次构建之后,.jar文件仍然具有不同的MD5总和.
CSI:Jar文件
我没有进行过检查和检查,并且罐子的内容和时间戳在"不同"的罐子之间匹配,但有一个例外:META-INF/MANIFEST.MF的不同时间戳.
码
<-- touch classes and manifest to set consistent timestamp across builds -->
<touch millis="0">
<fileset dir="${mycompany.ws.classes.dir}"/>
</touch>
<touch millis="0" file="mymanifest.mf"/>
<jar destfile="${derived.lib.dir}/mycompanyws.jar"
manifest="mymanifest.mf"
basedir="${mycompany.ws.classes.dir}"
includes="**/com/mycompany/**,**/org/apache/xml/**"
/>
Run Code Online (Sandbox Code Playgroud)
其他选择
如果.java文件已经更改,我们可以使用更高级的ant编程来检查.jar文件.
我正在使用Mybatis(用于持久化java到数据库)和Mybatis Generator(用于从数据库模式自动生成映射器xml文件和java接口)的项目.
Mybatis生成器在生成基本crud操作所需的文件方面做得很好.
上下文
对于某些表/类,我们需要比MyBatis Generator工具生成的"crud stuff"更多的"东西"(代码查询等).
有没有办法拥有"两全其美",即使用自动生成以及"自定义代码".如何分离和构建"手动编辑的文件"和"自动生成的文件".
提案
我正在考虑以下内容,即表格"Foo"
自动生成
(其中"Crud"代表"创建读取更新删除")
手编辑
概念:如果架构发生了变化,您可以随时安全地自动生成"Crud"xml和.java文件,而不会消除任何自定义更改.
问题
mybatis会正确处理这种情况,即这个映射器是否会正确执行自动生成的"crud代码"?
FooMapper fooMapper = sqlSession.getMapper(FooMapper.class);
你推荐什么方法?
编辑1:*我们的数据库设计使用"核心表"("元素"),其他表"扩展"该表并添加额外的属性(共享密钥).我查看了文档和来源得出结论,我不能将Mybatis Generator与这样的'扩展'结合使用而不需要任何手动编辑:
即这不起作用.-ElementMapper扩展"ElementCrudMapper"-FooMapper.xml扩展"ElementCrudMapper"和"FooCrudMapper"
谢谢大家!
java ×5
java-ee ×2
jdbc ×2
amazon-ec2 ×1
ant ×1
blocking ×1
caching ×1
git ×1
heap-dump ×1
jar ×1
jboss ×1
jmeter ×1
less ×1
load-testing ×1
locking ×1
mybatis ×1
performance ×1
powershell ×1
sql-server ×1
visualvm ×1
windows ×1